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.
- {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/PKG-INFO +3 -1
- {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/lesscode_flask/__init__.py +1 -1
- {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/lesscode_flask/app.py +7 -12
- {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/lesscode_flask/log/access_log_handler.py +10 -7
- {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/lesscode_flask/model/access_log.py +2 -0
- {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/lesscode_flask/utils/helpers.py +34 -0
- {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/lesscode_flask/utils/request/request.py +41 -23
- {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/lesscode_flask.egg-info/PKG-INFO +3 -1
- {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/lesscode_flask.egg-info/requires.txt +2 -0
- {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/README.md +0 -0
- {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/lesscode_flask/db/__init__.py +0 -0
- {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/lesscode_flask/db/datasource.py +0 -0
- {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/lesscode_flask/db/executor.py +0 -0
- {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/lesscode_flask/export_data/__init__.py +0 -0
- {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/lesscode_flask/export_data/data_download_handler.py +0 -0
- {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/lesscode_flask/model/base_model.py +0 -0
- {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/lesscode_flask/model/parameterized_query.py +0 -0
- {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/lesscode_flask/model/response_result.py +0 -0
- {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/lesscode_flask/model/user.py +0 -0
- {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/lesscode_flask/service/access_log_service.py +0 -0
- {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/lesscode_flask/service/base_service.py +0 -0
- {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/lesscode_flask/setting/__init__.py +0 -0
- {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/lesscode_flask/setup/__init__.py +0 -0
- {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/lesscode_flask/utils/__init__.py +0 -0
- {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/lesscode_flask/utils/decorator/__init__.py +0 -0
- {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/lesscode_flask/utils/decorator/cache.py +0 -0
- {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/lesscode_flask/utils/decorator/swagger.py +0 -0
- {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/lesscode_flask/utils/file/file_exporter.py +0 -0
- {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/lesscode_flask/utils/json/NotSortJSONProvider.py +0 -0
- {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/lesscode_flask/utils/oss/__init__.py +0 -0
- {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/lesscode_flask/utils/oss/ks3_oss.py +0 -0
- {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/lesscode_flask/utils/redis/redis_helper.py +0 -0
- {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/lesscode_flask/utils/swagger/swagger_template.py +0 -0
- {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/lesscode_flask/utils/swagger/swagger_util.py +0 -0
- {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/lesscode_flask/utils/thread/thread_utils.py +0 -0
- {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/lesscode_flask/wsgi.py +0 -0
- {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/lesscode_flask.egg-info/SOURCES.txt +0 -0
- {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/lesscode_flask.egg-info/dependency_links.txt +0 -0
- {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/lesscode_flask.egg-info/top_level.txt +0 -0
- {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/redash/query_runner/__init__.py +0 -0
- {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/redash/query_runner/clickhouse.py +0 -0
- {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/redash/query_runner/elasticsearch.py +0 -0
- {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/redash/query_runner/kingbase.py +0 -0
- {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/redash/query_runner/mysql.py +0 -0
- {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/redash/query_runner/pg.py +0 -0
- {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/redash/settings/__init__.py +0 -0
- {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/redash/settings/helpers.py +0 -0
- {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/redash/utils/__init__.py +0 -0
- {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/redash/utils/requests_session.py +0 -0
- {lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/setup.cfg +0 -0
- {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.
|
|
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
|
|
|
@@ -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
|
-
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
8
|
-
|
|
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
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
res =
|
|
27
|
-
if
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
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
|
-
|
|
43
|
-
|
|
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.
|
|
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
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/lesscode_flask/export_data/data_download_handler.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/lesscode_flask/service/access_log_service.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/lesscode_flask/utils/json/NotSortJSONProvider.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/lesscode_flask/utils/swagger/swagger_template.py
RENAMED
|
File without changes
|
{lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/lesscode_flask/utils/swagger/swagger_util.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{lesscode_flask-0.0.95 → lesscode_flask-0.0.97}/lesscode_flask.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|