lesscode-flask 0.2.104__tar.gz → 0.2.106__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. {lesscode_flask-0.2.104 → lesscode_flask-0.2.106}/PKG-INFO +1 -1
  2. {lesscode_flask-0.2.104 → lesscode_flask-0.2.106}/lesscode_flask/__init__.py +1 -1
  3. {lesscode_flask-0.2.104 → lesscode_flask-0.2.106}/lesscode_flask/setup/__init__.py +2 -1
  4. lesscode_flask-0.2.106/lesscode_flask/utils/sign/body_canonical.py +25 -0
  5. lesscode_flask-0.2.106/lesscode_flask/utils/sign/sign_main.py +95 -0
  6. {lesscode_flask-0.2.104 → lesscode_flask-0.2.106}/lesscode_flask/utils/sign/signature.py +6 -0
  7. {lesscode_flask-0.2.104 → lesscode_flask-0.2.106}/lesscode_flask.egg-info/PKG-INFO +1 -1
  8. {lesscode_flask-0.2.104 → lesscode_flask-0.2.106}/lesscode_flask.egg-info/SOURCES.txt +2 -0
  9. {lesscode_flask-0.2.104 → lesscode_flask-0.2.106}/README.md +0 -0
  10. {lesscode_flask-0.2.104 → lesscode_flask-0.2.106}/lesscode_flask/app.py +0 -0
  11. {lesscode_flask-0.2.104 → lesscode_flask-0.2.106}/lesscode_flask/db/__init__.py +0 -0
  12. {lesscode_flask-0.2.104 → lesscode_flask-0.2.106}/lesscode_flask/db/datasource.py +0 -0
  13. {lesscode_flask-0.2.104 → lesscode_flask-0.2.106}/lesscode_flask/db/executor.py +0 -0
  14. {lesscode_flask-0.2.104 → lesscode_flask-0.2.106}/lesscode_flask/export_data/__init__.py +0 -0
  15. {lesscode_flask-0.2.104 → lesscode_flask-0.2.106}/lesscode_flask/export_data/data_download_handler.py +0 -0
  16. {lesscode_flask-0.2.104 → lesscode_flask-0.2.106}/lesscode_flask/log/access_log_handler.py +0 -0
  17. {lesscode_flask-0.2.104 → lesscode_flask-0.2.106}/lesscode_flask/model/access_log.py +0 -0
  18. {lesscode_flask-0.2.104 → lesscode_flask-0.2.106}/lesscode_flask/model/base_model.py +0 -0
  19. {lesscode_flask-0.2.104 → lesscode_flask-0.2.106}/lesscode_flask/model/parameterized_query.py +0 -0
  20. {lesscode_flask-0.2.104 → lesscode_flask-0.2.106}/lesscode_flask/model/resource_param_template.py +0 -0
  21. {lesscode_flask-0.2.104 → lesscode_flask-0.2.106}/lesscode_flask/model/response_result.py +0 -0
  22. {lesscode_flask-0.2.104 → lesscode_flask-0.2.106}/lesscode_flask/model/user.py +0 -0
  23. {lesscode_flask-0.2.104 → lesscode_flask-0.2.106}/lesscode_flask/model/user_limit_policy.py +0 -0
  24. {lesscode_flask-0.2.104 → lesscode_flask-0.2.106}/lesscode_flask/service/access_log_service.py +0 -0
  25. {lesscode_flask-0.2.104 → lesscode_flask-0.2.106}/lesscode_flask/service/base_service.py +0 -0
  26. {lesscode_flask-0.2.104 → lesscode_flask-0.2.106}/lesscode_flask/service/resource_param_template_service.py +0 -0
  27. {lesscode_flask-0.2.104 → lesscode_flask-0.2.106}/lesscode_flask/setting/__init__.py +0 -0
  28. {lesscode_flask-0.2.104 → lesscode_flask-0.2.106}/lesscode_flask/signals.py +0 -0
  29. {lesscode_flask-0.2.104 → lesscode_flask-0.2.106}/lesscode_flask/static/swagger.py +0 -0
  30. {lesscode_flask-0.2.104 → lesscode_flask-0.2.106}/lesscode_flask/utils/__init__.py +0 -0
  31. {lesscode_flask-0.2.104 → lesscode_flask-0.2.106}/lesscode_flask/utils/decorator/__init__.py +0 -0
  32. {lesscode_flask-0.2.104 → lesscode_flask-0.2.106}/lesscode_flask/utils/decorator/cache.py +0 -0
  33. {lesscode_flask-0.2.104 → lesscode_flask-0.2.106}/lesscode_flask/utils/decorator/sql_injection.py +0 -0
  34. {lesscode_flask-0.2.104 → lesscode_flask-0.2.106}/lesscode_flask/utils/decorator/swagger.py +0 -0
  35. {lesscode_flask-0.2.104 → lesscode_flask-0.2.106}/lesscode_flask/utils/dify_utils.py +0 -0
  36. {lesscode_flask-0.2.104 → lesscode_flask-0.2.106}/lesscode_flask/utils/file/file_exporter.py +0 -0
  37. {lesscode_flask-0.2.104 → lesscode_flask-0.2.106}/lesscode_flask/utils/file/file_utils.py +0 -0
  38. {lesscode_flask-0.2.104 → lesscode_flask-0.2.106}/lesscode_flask/utils/fs_util.py +0 -0
  39. {lesscode_flask-0.2.104 → lesscode_flask-0.2.106}/lesscode_flask/utils/helpers.py +0 -0
  40. {lesscode_flask-0.2.104 → lesscode_flask-0.2.106}/lesscode_flask/utils/json/NotSortJSONProvider.py +0 -0
  41. {lesscode_flask-0.2.104 → lesscode_flask-0.2.106}/lesscode_flask/utils/limit/__init__.py +0 -0
  42. {lesscode_flask-0.2.104 → lesscode_flask-0.2.106}/lesscode_flask/utils/limit/consecutive/consecutive_limiter_handler.py +0 -0
  43. {lesscode_flask-0.2.104 → lesscode_flask-0.2.106}/lesscode_flask/utils/limit/consecutive/redis_consecutive_limiter.py +0 -0
  44. {lesscode_flask-0.2.104 → lesscode_flask-0.2.106}/lesscode_flask/utils/limit/limit_util.py +0 -0
  45. {lesscode_flask-0.2.104 → lesscode_flask-0.2.106}/lesscode_flask/utils/limit/req/rate_limiter_handler.py +0 -0
  46. {lesscode_flask-0.2.104 → lesscode_flask-0.2.106}/lesscode_flask/utils/limit/req/redis_rate_limiter.py +0 -0
  47. {lesscode_flask-0.2.104 → lesscode_flask-0.2.106}/lesscode_flask/utils/limit/req_count/count_limiter_handler.py +0 -0
  48. {lesscode_flask-0.2.104 → lesscode_flask-0.2.106}/lesscode_flask/utils/limit/req_count/redis_count_limiter.py +0 -0
  49. {lesscode_flask-0.2.104 → lesscode_flask-0.2.106}/lesscode_flask/utils/oss/__init__.py +0 -0
  50. {lesscode_flask-0.2.104 → lesscode_flask-0.2.106}/lesscode_flask/utils/oss/aliyun_oss.py +0 -0
  51. {lesscode_flask-0.2.104 → lesscode_flask-0.2.106}/lesscode_flask/utils/oss/ks3_oss.py +0 -0
  52. {lesscode_flask-0.2.104 → lesscode_flask-0.2.106}/lesscode_flask/utils/oss/minio_oss.py +0 -0
  53. {lesscode_flask-0.2.104 → lesscode_flask-0.2.106}/lesscode_flask/utils/redis/redis_helper.py +0 -0
  54. {lesscode_flask-0.2.104 → lesscode_flask-0.2.106}/lesscode_flask/utils/request/request.py +0 -0
  55. {lesscode_flask-0.2.104 → lesscode_flask-0.2.106}/lesscode_flask/utils/sign/__init__.py +0 -0
  56. {lesscode_flask-0.2.104 → lesscode_flask-0.2.106}/lesscode_flask/utils/swagger/swagger_template.py +0 -0
  57. {lesscode_flask-0.2.104 → lesscode_flask-0.2.106}/lesscode_flask/utils/swagger/swagger_util.py +0 -0
  58. {lesscode_flask-0.2.104 → lesscode_flask-0.2.106}/lesscode_flask/utils/task/__init__.py +0 -0
  59. {lesscode_flask-0.2.104 → lesscode_flask-0.2.106}/lesscode_flask/utils/task/task_helper.py +0 -0
  60. {lesscode_flask-0.2.104 → lesscode_flask-0.2.106}/lesscode_flask/utils/thread/thread_utils.py +0 -0
  61. {lesscode_flask-0.2.104 → lesscode_flask-0.2.106}/lesscode_flask/wsgi.py +0 -0
  62. {lesscode_flask-0.2.104 → lesscode_flask-0.2.106}/lesscode_flask.egg-info/dependency_links.txt +0 -0
  63. {lesscode_flask-0.2.104 → lesscode_flask-0.2.106}/lesscode_flask.egg-info/requires.txt +0 -0
  64. {lesscode_flask-0.2.104 → lesscode_flask-0.2.106}/lesscode_flask.egg-info/top_level.txt +0 -0
  65. {lesscode_flask-0.2.104 → lesscode_flask-0.2.106}/redash/query_runner/__init__.py +0 -0
  66. {lesscode_flask-0.2.104 → lesscode_flask-0.2.106}/redash/query_runner/clickhouse.py +0 -0
  67. {lesscode_flask-0.2.104 → lesscode_flask-0.2.106}/redash/query_runner/dameng.py +0 -0
  68. {lesscode_flask-0.2.104 → lesscode_flask-0.2.106}/redash/query_runner/elasticsearch.py +0 -0
  69. {lesscode_flask-0.2.104 → lesscode_flask-0.2.106}/redash/query_runner/kingbase.py +0 -0
  70. {lesscode_flask-0.2.104 → lesscode_flask-0.2.106}/redash/query_runner/mysql.py +0 -0
  71. {lesscode_flask-0.2.104 → lesscode_flask-0.2.106}/redash/query_runner/pg.py +0 -0
  72. {lesscode_flask-0.2.104 → lesscode_flask-0.2.106}/redash/settings/__init__.py +0 -0
  73. {lesscode_flask-0.2.104 → lesscode_flask-0.2.106}/redash/settings/helpers.py +0 -0
  74. {lesscode_flask-0.2.104 → lesscode_flask-0.2.106}/redash/utils/__init__.py +0 -0
  75. {lesscode_flask-0.2.104 → lesscode_flask-0.2.106}/redash/utils/requests_session.py +0 -0
  76. {lesscode_flask-0.2.104 → lesscode_flask-0.2.106}/setup.cfg +0 -0
  77. {lesscode_flask-0.2.104 → lesscode_flask-0.2.106}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lesscode-flask
3
- Version: 0.2.104
3
+ Version: 0.2.106
4
4
  Summary: lesscode-flask 是基于flask的web开发脚手架项目,该项目初衷为简化开发过程,让研发人员更加关注业务。
5
5
  Home-page: https://lesscode-flask
6
6
  Author: Chao.yy
@@ -1,4 +1,4 @@
1
- __version__ = "0.2.104"
1
+ __version__ = "0.2.106"
2
2
 
3
3
  import functools
4
4
  import logging
@@ -296,6 +296,7 @@ def _build_proxy_view(app, target_url, title, description=None, dynamic_params=N
296
296
  url = url.replace(f"<{key}>", value).replace(f"{{{key}}}", value)
297
297
 
298
298
  headers = _build_forward_headers(app)
299
+ capability_platform_proxy_timeout = app.config.get("CAPABILITY_PLATFORM_PROXY_TIMEOUT", 30) or 30
299
300
 
300
301
  resp = requests.request(
301
302
  method=request.method,
@@ -303,7 +304,7 @@ def _build_proxy_view(app, target_url, title, description=None, dynamic_params=N
303
304
  params=request.args.to_dict(flat=False),
304
305
  data=request.get_data(),
305
306
  headers=headers,
306
- timeout=30,
307
+ timeout=capability_platform_proxy_timeout,
307
308
  )
308
309
 
309
310
  excluded_headers = {"content-encoding", "content-length", "transfer-encoding", "connection"}
@@ -0,0 +1,25 @@
1
+ import json
2
+
3
+
4
+ def _is_json_content_type(content_type: str) -> bool:
5
+ normalized = (content_type or "").split(";", 1)[0].strip().lower()
6
+ return normalized == "application/json" or normalized.endswith("+json")
7
+
8
+
9
+ def canonicalize_body_bytes(body_bytes: bytes, content_type: str = "") -> bytes:
10
+ """
11
+ JSON 请求体统一规范化后再参与签名,避免不同链路重排字段顺序导致 hash 不一致。
12
+ 非 JSON 请求体保持原始 bytes,不影响文件上传、表单和纯文本请求。
13
+ """
14
+ if not body_bytes or not _is_json_content_type(content_type):
15
+ return body_bytes or b""
16
+ try:
17
+ payload = json.loads(body_bytes)
18
+ except (TypeError, ValueError):
19
+ return body_bytes
20
+ return json.dumps(
21
+ payload,
22
+ ensure_ascii=False,
23
+ separators=(",", ":"),
24
+ sort_keys=True,
25
+ ).encode("utf-8")
@@ -0,0 +1,95 @@
1
+ import hashlib
2
+ import hmac
3
+ import time
4
+ import uuid
5
+ from urllib.parse import urlparse
6
+
7
+
8
+ def body_sha256(body_bytes: bytes) -> str:
9
+ """对请求体原始 bytes 做 SHA256,保持与服务端 request.get_data() 一致。"""
10
+ return hashlib.sha256(body_bytes).hexdigest()
11
+
12
+
13
+ def build_sign_content(method: str, path: str, query_string: str, body_bytes: bytes, timestamp: str, nonce: str) -> str:
14
+ """
15
+ 生成规范签名串:
16
+ METHOD \n PATH \n QUERY_STRING \n BODY_SHA256 \n TIMESTAMP \n NONCE
17
+ """
18
+ return (
19
+ f"{method.upper()}\n"
20
+ f"{path}\n"
21
+ f"{query_string}\n"
22
+ f"{body_sha256(body_bytes)}\n"
23
+ f"{timestamp}\n"
24
+ f"{nonce}"
25
+ )
26
+
27
+
28
+ def generate_signature(secret: str, sign_content: str) -> str:
29
+ """用 HMAC-SHA256 生成十六进制签名。"""
30
+ return hmac.new(secret.encode("utf-8"), sign_content.encode("utf-8"), hashlib.sha256).hexdigest()
31
+
32
+
33
+ def parse_path_and_query(url: str) -> tuple[str, str]:
34
+ """从完整 URL 提取 path 和 query_string。"""
35
+ parsed = urlparse(url)
36
+ path = parsed.path or "/"
37
+ query_string = parsed.query or ""
38
+ return path, query_string
39
+
40
+
41
+ def main():
42
+ # ===== 在这里粘贴你的请求信息(开始)=====
43
+ request_url = "http://localhost:8968/ike2b/navigation/cluster/test_sign"
44
+ request_method = "POST"
45
+ request_body = '{"type":1}'
46
+ sign_secret = "test_sign_secret"
47
+ # 可选:不填则自动生成
48
+ request_timestamp = ""
49
+ request_nonce = ""
50
+ # 可选:你的发送工具若会在 body 末尾补换行,改成 True
51
+ append_newline_to_body = False
52
+ # ===== 在这里粘贴你的请求信息(结束)=====
53
+
54
+ method = request_method.upper()
55
+ path, query_string = parse_path_and_query(request_url)
56
+ timestamp = request_timestamp or str(int(time.time()))
57
+ nonce = request_nonce or uuid.uuid4().hex
58
+
59
+ body = request_body or ""
60
+ body_bytes = body.encode("utf-8")
61
+ if append_newline_to_body:
62
+ body_bytes += b"\n"
63
+
64
+ sign_content = build_sign_content(
65
+ method=method,
66
+ path=path,
67
+ query_string=query_string,
68
+ body_bytes=body_bytes,
69
+ timestamp=timestamp,
70
+ nonce=nonce,
71
+ )
72
+ signature = generate_signature(sign_secret, sign_content)
73
+ body_hash = body_sha256(body_bytes)
74
+
75
+ print("=== 签名结果 ===")
76
+ print(f"Timestamp: {timestamp}")
77
+ print(f"Nonce: {nonce}")
78
+ print(f"Signature: {signature}")
79
+ print(f"Body-SHA256: {body_hash}")
80
+ print(f"Body-Bytes-Len: {len(body_bytes)}")
81
+ print()
82
+ print("=== 可直接追加到 curl 的请求头 ===")
83
+ print(f"--header 'Timestamp: {timestamp}' \\")
84
+ print(f"--header 'Nonce: {nonce}' \\")
85
+ print(f"--header 'Signature: {signature}'")
86
+ print()
87
+ print("=== 调试信息(参与签名的 body bytes)===")
88
+ print(repr(body_bytes))
89
+ print()
90
+ print("=== 调试信息(服务端签名原文)===")
91
+ print(sign_content)
92
+
93
+
94
+ if __name__ == "__main__":
95
+ main()
@@ -41,6 +41,12 @@ def _body_sha256() -> str:
41
41
  # JSON 请求先做规范化再哈希,避免中间链路重排字段顺序后签名失配。
42
42
  body_bytes = request.get_data(cache=True) or b""
43
43
  canonical_body_bytes = canonicalize_body_bytes(body_bytes, request.content_type or "")
44
+ logging.info("body_bytes开始")
45
+ logging.info("body_bytes: %s", body_bytes)
46
+ logging.info("body_bytes结束")
47
+ logging.info("canonical_body_bytes开始")
48
+ logging.info("canonical_body_bytes: %s", canonical_body_bytes)
49
+ logging.info("canonical_body_bytes结束")
44
50
  return hashlib.sha256(canonical_body_bytes).hexdigest()
45
51
 
46
52
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lesscode-flask
3
- Version: 0.2.104
3
+ Version: 0.2.106
4
4
  Summary: lesscode-flask 是基于flask的web开发脚手架项目,该项目初衷为简化开发过程,让研发人员更加关注业务。
5
5
  Home-page: https://lesscode-flask
6
6
  Author: Chao.yy
@@ -54,6 +54,8 @@ lesscode_flask/utils/oss/minio_oss.py
54
54
  lesscode_flask/utils/redis/redis_helper.py
55
55
  lesscode_flask/utils/request/request.py
56
56
  lesscode_flask/utils/sign/__init__.py
57
+ lesscode_flask/utils/sign/body_canonical.py
58
+ lesscode_flask/utils/sign/sign_main.py
57
59
  lesscode_flask/utils/sign/signature.py
58
60
  lesscode_flask/utils/swagger/swagger_template.py
59
61
  lesscode_flask/utils/swagger/swagger_util.py