lesscode-flask 0.0.95__tar.gz → 0.0.97__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 (51) hide show
  1. {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/PKG-INFO +3 -1
  2. {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/lesscode_flask/__init__.py +1 -1
  3. {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/lesscode_flask/app.py +7 -12
  4. {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/lesscode_flask/log/access_log_handler.py +10 -7
  5. {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/lesscode_flask/model/access_log.py +2 -0
  6. {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/lesscode_flask/utils/helpers.py +34 -0
  7. {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/lesscode_flask/utils/request/request.py +41 -23
  8. {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/lesscode_flask.egg-info/PKG-INFO +3 -1
  9. {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/lesscode_flask.egg-info/requires.txt +2 -0
  10. {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/README.md +0 -0
  11. {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/lesscode_flask/db/__init__.py +0 -0
  12. {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/lesscode_flask/db/datasource.py +0 -0
  13. {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/lesscode_flask/db/executor.py +0 -0
  14. {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/lesscode_flask/export_data/__init__.py +0 -0
  15. {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/lesscode_flask/export_data/data_download_handler.py +0 -0
  16. {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/lesscode_flask/model/base_model.py +0 -0
  17. {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/lesscode_flask/model/parameterized_query.py +0 -0
  18. {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/lesscode_flask/model/response_result.py +0 -0
  19. {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/lesscode_flask/model/user.py +0 -0
  20. {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/lesscode_flask/service/access_log_service.py +0 -0
  21. {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/lesscode_flask/service/base_service.py +0 -0
  22. {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/lesscode_flask/setting/__init__.py +0 -0
  23. {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/lesscode_flask/setup/__init__.py +0 -0
  24. {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/lesscode_flask/utils/__init__.py +0 -0
  25. {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/lesscode_flask/utils/decorator/__init__.py +0 -0
  26. {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/lesscode_flask/utils/decorator/cache.py +0 -0
  27. {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/lesscode_flask/utils/decorator/swagger.py +0 -0
  28. {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/lesscode_flask/utils/file/file_exporter.py +0 -0
  29. {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/lesscode_flask/utils/json/NotSortJSONProvider.py +0 -0
  30. {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/lesscode_flask/utils/oss/__init__.py +0 -0
  31. {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/lesscode_flask/utils/oss/ks3_oss.py +0 -0
  32. {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/lesscode_flask/utils/redis/redis_helper.py +0 -0
  33. {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/lesscode_flask/utils/swagger/swagger_template.py +0 -0
  34. {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/lesscode_flask/utils/swagger/swagger_util.py +0 -0
  35. {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/lesscode_flask/utils/thread/thread_utils.py +0 -0
  36. {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/lesscode_flask/wsgi.py +0 -0
  37. {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/lesscode_flask.egg-info/SOURCES.txt +0 -0
  38. {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/lesscode_flask.egg-info/dependency_links.txt +0 -0
  39. {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/lesscode_flask.egg-info/top_level.txt +0 -0
  40. {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/redash/query_runner/__init__.py +0 -0
  41. {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/redash/query_runner/clickhouse.py +0 -0
  42. {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/redash/query_runner/elasticsearch.py +0 -0
  43. {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/redash/query_runner/kingbase.py +0 -0
  44. {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/redash/query_runner/mysql.py +0 -0
  45. {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/redash/query_runner/pg.py +0 -0
  46. {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/redash/settings/__init__.py +0 -0
  47. {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/redash/settings/helpers.py +0 -0
  48. {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/redash/utils/__init__.py +0 -0
  49. {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/redash/utils/requests_session.py +0 -0
  50. {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/setup.cfg +0 -0
  51. {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: lesscode-flask
3
- Version: 0.0.95
3
+ Version: 0.0.97
4
4
  Summary: lesscode-flask 是基于flask的web开发脚手架项目,该项目初衷为简化开发过程,让研发人员更加关注业务。
5
5
  Home-page: https://lesscode-flask
6
6
  Author: Chao.yy
@@ -24,6 +24,8 @@ Requires-Dist: requests==2.32.3
24
24
  Requires-Dist: gunicorn==23.0.0
25
25
  Requires-Dist: gevent==24.10.2
26
26
  Requires-Dist: openpyxl==3.1.5
27
+ Requires-Dist: iputil==0.3.1
28
+ Requires-Dist: phone==0.4.5
27
29
 
28
30
  # lesscode-flask
29
31
 
@@ -1,4 +1,4 @@
1
- __version__ = '0.0.95'
1
+ __version__ = '0.0.97'
2
2
 
3
3
  import functools
4
4
  import logging
@@ -10,7 +10,7 @@ from importlib import import_module
10
10
 
11
11
  from flask import Flask, typing as ft, Response
12
12
  from flask.globals import request_ctx, request
13
- # from flask_login import current_user
13
+ from flask_login import current_user
14
14
  from lesscode_utils.json_utils import JSONEncoder
15
15
  from werkzeug.middleware.proxy_fix import ProxyFix
16
16
 
@@ -53,18 +53,13 @@ class Lesscoder(Flask):
53
53
  self.register_error_handler(Exception, self.handle_exception)
54
54
 
55
55
  def preprocess_request(self) -> ft.ResponseReturnValue | None:
56
- v = super(Lesscoder, self).preprocess_request()
56
+ v = super(Lesscoder, self).preprocess_request()
57
57
  if self.config.get("AUTHORIZATION_ENABLE"): # 启动 AUTHORIZATION_ENABLE 才进行权限验证
58
- try:
59
- flask_login = import_module("flask_login")
60
- except ImportError as e:
61
- raise Exception(f"flask_login is not exist,run:pip install Flask-Login==0.6.3")
62
58
  # 获取当前请求的url
63
59
  url = request.path
64
60
  # 获取URL 对应的id 与访问权限
65
61
  id, access = RedisHelper(app_config.get("REDIS_OAUTH_KEY", "redis")).sync_hmget(f"upms:url_info:{url}",
66
62
  ["id", "access"])
67
- current_user = flask_login.current_user
68
63
  if not id:
69
64
  # 如果没有进行注册的url 默认需要登录权限
70
65
  access = app_config.get("AUTH_DEFAULT_ACCESS", "0")
@@ -72,12 +67,12 @@ class Lesscoder(Flask):
72
67
  if str(access) == "1": # 需要登录
73
68
  if current_user.is_anonymous_user:
74
69
  # abort(403, "需要登录")
75
- ResponseResult.fail("请登录后访问", status_code="403",http_code="403")
70
+ ResponseResult.fail("请登录后访问", status_code="403", http_code="403")
76
71
  elif str(access) == "2": # 需要权限
77
72
  if current_user.is_anonymous_user:
78
- ResponseResult.fail("请登录后访问", status_code="403",http_code="403")
73
+ ResponseResult.fail("请登录后访问", status_code="403", http_code="403")
79
74
  if not current_user.has_permission(id):
80
- ResponseResult.fail("请获取授权后访问", status_code="403",http_code="403")
75
+ ResponseResult.fail("请获取授权后访问", status_code="403", http_code="403")
81
76
  return v
82
77
 
83
78
  def full_dispatch_request(self) -> Response:
@@ -95,7 +90,7 @@ class Lesscoder(Flask):
95
90
  # duration = time.time() - start_time
96
91
  # 100 为自定义 'ACCESS' 的日志级别标识
97
92
  logging.log(100, "访问日志", {"request_id": request_id, "start_time": start_time, "end_time": time.time(),
98
- "status_code": response.status_code})
93
+ "status_code": response.status_code})
99
94
  return response
100
95
 
101
96
  def dispatch_request(self) -> ft.ResponseReturnValue:
@@ -150,8 +145,8 @@ class Lesscoder(Flask):
150
145
  self.register_blueprint(blueprint)
151
146
  setup_resource_register(self)
152
147
  setup_data_download(self)
153
- # setup_static(self)
154
148
 
149
+ # setup_static(self)
155
150
 
156
151
  @staticmethod
157
152
  def handle_exception(e):
@@ -2,9 +2,11 @@ import threading
2
2
  from importlib import import_module
3
3
  from logging import Handler
4
4
 
5
+ import iputil
5
6
  from flask import request, copy_current_request_context
6
7
 
7
8
  from lesscode_flask.model.access_log import AccessLog
9
+ from lesscode_flask.model.user import flask_login
8
10
  from lesscode_flask.service.access_log_service import AccessLogService
9
11
  from lesscode_flask.utils.helpers import app_config
10
12
  from lesscode_flask.utils.redis.redis_helper import RedisHelper
@@ -42,21 +44,22 @@ class AccessLogHandler(Handler):
42
44
 
43
45
  resource_id = "-"
44
46
  resource_label = "-"
47
+ client_id = "-"
45
48
  try:
46
- url_info = RedisHelper(app_config.get("REDIS_OAUTH_KEY", "redis")).sync_hgetall(url_info_key)
49
+ url_info = RedisHelper(app_config.get("REDIS_OAUTH_KEY", "redis")).sync_hgetall(url_info_key,
50
+ ["id", "label",
51
+ "client_id"])
47
52
  if url_info:
48
53
  resource_id = url_info.get("id", "-")
49
54
  resource_label = url_info.get("label", "-")
55
+ client_id = url_info.get("client_id", "-")
50
56
  except Exception as e:
51
57
  pass
52
- try:
53
- flask_login = import_module("flask_login")
54
- except ImportError as e:
55
- raise Exception(f"flask_login is not exist,run:pip install Flask-Login==0.6.3")
58
+ location: str = iputil.get_region(client_ip)
56
59
  current_user = flask_login.current_user
57
60
  access_log = AccessLog(request_id=request_id, display_name=current_user.display_name,
58
- obj_id=current_user.id, type=current_user.type,
59
- resource_id=resource_id,
61
+ obj_id=current_user.id, type=current_user.type, client_id=client_id,
62
+ resource_id=resource_id, location=location,
60
63
  resource_label=resource_label, url=url, referrer=referrer, client_ip=client_ip,
61
64
  user_agent=user_agent_string, start_time=start_time, end_time=end_time,
62
65
  duration=end_time - start_time, status_code=status_code,
@@ -13,11 +13,13 @@ class AccessLog(BaseModel):
13
13
  display_name = Column(String(64), comment='显示名')
14
14
  obj_id = Column(String(255), comment='对象标识')
15
15
  type = Column(Integer, comment='请求类型0:用户请求,1:API用户,2:匿名用户')
16
+ client_id = Column(String(32), comment='资源所属应用id)')
16
17
  resource_id = Column(String(32), comment='资源id)')
17
18
  resource_label = Column(String(128), comment='菜单显示名(操作)')
18
19
  url = Column(String(255), comment='访问地址')
19
20
  referrer = Column(String(255), comment='访问来源')
20
21
  client_ip = Column(String(255), comment='客户端ip')
22
+ location = Column(String(255), comment='IP地区')
21
23
  user_agent = Column(String(512), comment='客户端')
22
24
  params = Column(JSON)
23
25
  start_time = Column(DOUBLE, comment='开始时间')
@@ -1,3 +1,9 @@
1
+ import logging
2
+
3
+ import iputil
4
+ from phone import Phone
5
+
6
+
1
7
  class app_config:
2
8
 
3
9
  @staticmethod
@@ -205,3 +211,31 @@ def format_page_index(data_list, page_num, page_size, index_key="index"):
205
211
  """
206
212
  index = (page_num - 1) * page_size + 1
207
213
  format_list_index(data_list, index, index_key=index_key)
214
+
215
+
216
+ def get_phone_location(phone: str):
217
+ try:
218
+ phone_info = Phone().find(phone)
219
+ return phone_info
220
+ except Exception as e:
221
+ return None
222
+
223
+
224
+ def get_ip_location(ip):
225
+ region: str = iputil.get_region(ip)
226
+ data = {
227
+ "country": "",
228
+ "area": "",
229
+ "province": "",
230
+ "city": "",
231
+ "isp": ""
232
+ }
233
+ region_info_list = region.split("|")
234
+ if len(region_info_list):
235
+ data = {
236
+ "country": region_info_list[0],
237
+ "province": region_info_list[2],
238
+ "city": region_info_list[3],
239
+ "isp": region_info_list[4]
240
+ }
241
+ return data
@@ -4,12 +4,32 @@ import uuid
4
4
  from flask import current_app, abort
5
5
 
6
6
 
7
- def sync_common_request(method, path, params=None, data=None, json=None, base_url=None, result_type="json",
8
- pack=False, connect_config=None, **kwargs):
7
+ def get_basic_auth(username, password):
8
+ try:
9
+ httpx = importlib.import_module("httpx")
10
+ except ImportError as e:
11
+ raise Exception(f"httpx is not exist,run:pip install httpx==0.24.1")
12
+ return httpx.BasicAuth(username, password)
13
+
14
+
15
+ def sync_common_request_origin(url, method, params=None, data=None, json=None, connect_config=None,
16
+ **kwargs):
17
+ if not connect_config or not isinstance(connect_config, dict):
18
+ connect_config = {"timeout": None}
9
19
  try:
10
20
  httpx = importlib.import_module("httpx")
11
21
  except ImportError as e:
12
22
  raise Exception(f"httpx is not exist,run:pip install httpx==0.24.1")
23
+ with httpx.Client(**connect_config) as session:
24
+ try:
25
+ res = session.request(method.upper(), url=url, params=params, data=data, json=json, **kwargs)
26
+ return res
27
+ except Exception as e:
28
+ raise e
29
+
30
+
31
+ def sync_common_request(method, path, params=None, data=None, json=None, base_url=None, result_type="json",
32
+ pack=False, connect_config=None, **kwargs):
13
33
  if not base_url:
14
34
  base_url = current_app.config.get("CAPABILITY_PLATFORM_SERVER", "")
15
35
  headers = kwargs.get("headers", {})
@@ -19,28 +39,26 @@ def sync_common_request(method, path, params=None, data=None, json=None, base_ur
19
39
  project_name = current_app.config.get("PROJECT_NAME", "").encode("utf-8")
20
40
  headers["Project-Name"] = project_name
21
41
  kwargs["headers"] = headers
22
- if not connect_config or not isinstance(connect_config, dict):
23
- connect_config = {"timeout": None}
24
- with httpx.Client(**connect_config) as session:
25
- try:
26
- res = session.request(method.upper(), url=base_url + path, params=params, data=data, json=json, **kwargs)
27
- if result_type == "json":
28
- res = res.json()
29
- if not pack:
30
- if res.get("status") == "00000":
31
- res = res.get("data")
32
- else:
33
- message = f'ori_message:{res.get("status", "")}, {res.get("message", "未知错误")}'
34
- abort("500", message)
35
- elif result_type == "text":
36
- res = res.text
37
- elif result_type == "origin":
38
- return res
39
- else:
40
- res = res.content
42
+ try:
43
+ res = sync_common_request_origin(url=base_url + path, method=method.upper(), params=params, data=data,
44
+ json=json, connect_config=connect_config, **kwargs)
45
+ if result_type == "json":
46
+ res = res.json()
47
+ if not pack:
48
+ if res.get("status") == "00000":
49
+ res = res.get("data")
50
+ else:
51
+ message = f'ori_message:{res.get("status", "")}, {res.get("message", "未知错误")}'
52
+ abort("500", message)
53
+ elif result_type == "text":
54
+ res = res.text
55
+ elif result_type == "origin":
41
56
  return res
42
- except Exception as e:
43
- raise e
57
+ else:
58
+ res = res.content
59
+ return res
60
+ except Exception as e:
61
+ raise e
44
62
 
45
63
 
46
64
  def sync_get(path, params=None, base_url=None, result_type="json", pack=False, connect_config=None, **kwargs):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: lesscode-flask
3
- Version: 0.0.95
3
+ Version: 0.0.97
4
4
  Summary: lesscode-flask 是基于flask的web开发脚手架项目,该项目初衷为简化开发过程,让研发人员更加关注业务。
5
5
  Home-page: https://lesscode-flask
6
6
  Author: Chao.yy
@@ -24,6 +24,8 @@ Requires-Dist: requests==2.32.3
24
24
  Requires-Dist: gunicorn==23.0.0
25
25
  Requires-Dist: gevent==24.10.2
26
26
  Requires-Dist: openpyxl==3.1.5
27
+ Requires-Dist: iputil==0.3.1
28
+ Requires-Dist: phone==0.4.5
27
29
 
28
30
  # lesscode-flask
29
31
 
@@ -12,3 +12,5 @@ requests==2.32.3
12
12
  gunicorn==23.0.0
13
13
  gevent==24.10.2
14
14
  openpyxl==3.1.5
15
+ iputil==0.3.1
16
+ phone==0.4.5