lesscode-flask 0.2.7__tar.gz → 0.2.9__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.2.7 → lesscode_flask-0.2.9}/PKG-INFO +1 -1
- {lesscode_flask-0.2.7 → lesscode_flask-0.2.9}/lesscode_flask/__init__.py +1 -1
- {lesscode_flask-0.2.7 → lesscode_flask-0.2.9}/lesscode_flask/setting/__init__.py +6 -3
- lesscode_flask-0.2.9/lesscode_flask/utils/fs_util.py +55 -0
- lesscode_flask-0.2.9/lesscode_flask/utils/limit/req/rate_limiter_handler.py +46 -0
- lesscode_flask-0.2.9/lesscode_flask/utils/limit/req_count/count_limiter_handler.py +46 -0
- {lesscode_flask-0.2.7 → lesscode_flask-0.2.9}/lesscode_flask.egg-info/PKG-INFO +1 -1
- {lesscode_flask-0.2.7 → lesscode_flask-0.2.9}/lesscode_flask.egg-info/SOURCES.txt +1 -1
- lesscode_flask-0.2.7/lesscode_flask/utils/limit/req/rate_limiter_handler.py +0 -28
- lesscode_flask-0.2.7/lesscode_flask/utils/limit/req_count/count_limiter_handler.py +0 -20
- lesscode_flask-0.2.7/lesscode_flask/utils/task/__init__.py +0 -0
- {lesscode_flask-0.2.7 → lesscode_flask-0.2.9}/README.md +0 -0
- {lesscode_flask-0.2.7 → lesscode_flask-0.2.9}/lesscode_flask/app.py +0 -0
- {lesscode_flask-0.2.7 → lesscode_flask-0.2.9}/lesscode_flask/db/__init__.py +0 -0
- {lesscode_flask-0.2.7 → lesscode_flask-0.2.9}/lesscode_flask/db/datasource.py +0 -0
- {lesscode_flask-0.2.7 → lesscode_flask-0.2.9}/lesscode_flask/db/executor.py +0 -0
- {lesscode_flask-0.2.7 → lesscode_flask-0.2.9}/lesscode_flask/export_data/__init__.py +0 -0
- {lesscode_flask-0.2.7 → lesscode_flask-0.2.9}/lesscode_flask/export_data/data_download_handler.py +0 -0
- {lesscode_flask-0.2.7 → lesscode_flask-0.2.9}/lesscode_flask/log/access_log_handler.py +0 -0
- {lesscode_flask-0.2.7 → lesscode_flask-0.2.9}/lesscode_flask/model/access_log.py +0 -0
- {lesscode_flask-0.2.7 → lesscode_flask-0.2.9}/lesscode_flask/model/base_model.py +0 -0
- {lesscode_flask-0.2.7 → lesscode_flask-0.2.9}/lesscode_flask/model/parameterized_query.py +0 -0
- {lesscode_flask-0.2.7 → lesscode_flask-0.2.9}/lesscode_flask/model/resource_param_template.py +0 -0
- {lesscode_flask-0.2.7 → lesscode_flask-0.2.9}/lesscode_flask/model/response_result.py +0 -0
- {lesscode_flask-0.2.7 → lesscode_flask-0.2.9}/lesscode_flask/model/user.py +0 -0
- {lesscode_flask-0.2.7 → lesscode_flask-0.2.9}/lesscode_flask/service/access_log_service.py +0 -0
- {lesscode_flask-0.2.7 → lesscode_flask-0.2.9}/lesscode_flask/service/base_service.py +0 -0
- {lesscode_flask-0.2.7 → lesscode_flask-0.2.9}/lesscode_flask/service/resource_param_template_service.py +0 -0
- {lesscode_flask-0.2.7 → lesscode_flask-0.2.9}/lesscode_flask/setup/__init__.py +0 -0
- {lesscode_flask-0.2.7 → lesscode_flask-0.2.9}/lesscode_flask/signals.py +0 -0
- {lesscode_flask-0.2.7 → lesscode_flask-0.2.9}/lesscode_flask/static/swagger.py +0 -0
- {lesscode_flask-0.2.7/lesscode_flask/utils → lesscode_flask-0.2.9/lesscode_flask/utils/decorator}/__init__.py +0 -0
- {lesscode_flask-0.2.7 → lesscode_flask-0.2.9}/lesscode_flask/utils/decorator/cache.py +0 -0
- {lesscode_flask-0.2.7 → lesscode_flask-0.2.9}/lesscode_flask/utils/decorator/swagger.py +0 -0
- {lesscode_flask-0.2.7 → lesscode_flask-0.2.9}/lesscode_flask/utils/dify_utils.py +0 -0
- {lesscode_flask-0.2.7 → lesscode_flask-0.2.9}/lesscode_flask/utils/file/file_exporter.py +0 -0
- {lesscode_flask-0.2.7 → lesscode_flask-0.2.9}/lesscode_flask/utils/file/file_utils.py +0 -0
- {lesscode_flask-0.2.7 → lesscode_flask-0.2.9}/lesscode_flask/utils/helpers.py +0 -0
- {lesscode_flask-0.2.7 → lesscode_flask-0.2.9}/lesscode_flask/utils/json/NotSortJSONProvider.py +0 -0
- {lesscode_flask-0.2.7 → lesscode_flask-0.2.9}/lesscode_flask/utils/limit/__init__.py +0 -0
- {lesscode_flask-0.2.7 → lesscode_flask-0.2.9}/lesscode_flask/utils/limit/limit_util.py +0 -0
- {lesscode_flask-0.2.7 → lesscode_flask-0.2.9}/lesscode_flask/utils/limit/req/redis_rate_limiter.py +0 -0
- {lesscode_flask-0.2.7 → lesscode_flask-0.2.9}/lesscode_flask/utils/limit/req_count/redis_count_limiter.py +0 -0
- {lesscode_flask-0.2.7 → lesscode_flask-0.2.9}/lesscode_flask/utils/oss/__init__.py +0 -0
- {lesscode_flask-0.2.7 → lesscode_flask-0.2.9}/lesscode_flask/utils/oss/aliyun_oss.py +0 -0
- {lesscode_flask-0.2.7 → lesscode_flask-0.2.9}/lesscode_flask/utils/oss/ks3_oss.py +0 -0
- {lesscode_flask-0.2.7 → lesscode_flask-0.2.9}/lesscode_flask/utils/oss/minio_oss.py +0 -0
- {lesscode_flask-0.2.7 → lesscode_flask-0.2.9}/lesscode_flask/utils/redis/redis_helper.py +0 -0
- {lesscode_flask-0.2.7 → lesscode_flask-0.2.9}/lesscode_flask/utils/request/request.py +0 -0
- {lesscode_flask-0.2.7 → lesscode_flask-0.2.9}/lesscode_flask/utils/swagger/swagger_template.py +0 -0
- {lesscode_flask-0.2.7 → lesscode_flask-0.2.9}/lesscode_flask/utils/swagger/swagger_util.py +0 -0
- {lesscode_flask-0.2.7/lesscode_flask/utils/decorator → lesscode_flask-0.2.9/lesscode_flask/utils/task}/__init__.py +0 -0
- {lesscode_flask-0.2.7 → lesscode_flask-0.2.9}/lesscode_flask/utils/task/task_helper.py +0 -0
- {lesscode_flask-0.2.7 → lesscode_flask-0.2.9}/lesscode_flask/utils/thread/thread_utils.py +0 -0
- {lesscode_flask-0.2.7 → lesscode_flask-0.2.9}/lesscode_flask/wsgi.py +0 -0
- {lesscode_flask-0.2.7 → lesscode_flask-0.2.9}/lesscode_flask.egg-info/dependency_links.txt +0 -0
- {lesscode_flask-0.2.7 → lesscode_flask-0.2.9}/lesscode_flask.egg-info/requires.txt +0 -0
- {lesscode_flask-0.2.7 → lesscode_flask-0.2.9}/lesscode_flask.egg-info/top_level.txt +0 -0
- {lesscode_flask-0.2.7 → lesscode_flask-0.2.9}/redash/query_runner/__init__.py +0 -0
- {lesscode_flask-0.2.7 → lesscode_flask-0.2.9}/redash/query_runner/clickhouse.py +0 -0
- {lesscode_flask-0.2.7 → lesscode_flask-0.2.9}/redash/query_runner/elasticsearch.py +0 -0
- {lesscode_flask-0.2.7 → lesscode_flask-0.2.9}/redash/query_runner/kingbase.py +0 -0
- {lesscode_flask-0.2.7 → lesscode_flask-0.2.9}/redash/query_runner/mysql.py +0 -0
- {lesscode_flask-0.2.7 → lesscode_flask-0.2.9}/redash/query_runner/pg.py +0 -0
- {lesscode_flask-0.2.7 → lesscode_flask-0.2.9}/redash/settings/__init__.py +0 -0
- {lesscode_flask-0.2.7 → lesscode_flask-0.2.9}/redash/settings/helpers.py +0 -0
- {lesscode_flask-0.2.7 → lesscode_flask-0.2.9}/redash/utils/__init__.py +0 -0
- {lesscode_flask-0.2.7 → lesscode_flask-0.2.9}/redash/utils/requests_session.py +0 -0
- {lesscode_flask-0.2.7 → lesscode_flask-0.2.9}/setup.cfg +0 -0
- {lesscode_flask-0.2.7 → lesscode_flask-0.2.9}/setup.py +0 -0
|
@@ -100,13 +100,13 @@ class BaseConfig:
|
|
|
100
100
|
RATE_LIMIT_BURST = 0
|
|
101
101
|
|
|
102
102
|
# 是否启用限流计数验证
|
|
103
|
-
COUNT_LIMIT_ENABLE: bool =
|
|
103
|
+
COUNT_LIMIT_ENABLE: bool = False
|
|
104
104
|
# 触发限流的处理函数
|
|
105
105
|
COUNT_LIMIT_HANDLER = CountLimitHandler
|
|
106
106
|
# 窗口期内最大访问量
|
|
107
|
-
COUNT_LIMIT_COUNT =
|
|
107
|
+
COUNT_LIMIT_COUNT = 500
|
|
108
108
|
# 窗口期时长 单位秒
|
|
109
|
-
COUNT_LIMIT_TIME_WINDOW = 60
|
|
109
|
+
COUNT_LIMIT_TIME_WINDOW = 60*60*12
|
|
110
110
|
# 白名单
|
|
111
111
|
LIMIT_WHITE_LIST: list = ["/ike2b/user/WXOA/login", "/ike2b/detail/company/node/get_note",
|
|
112
112
|
"/ike2b/user/attention/attention_company_status",
|
|
@@ -114,6 +114,9 @@ class BaseConfig:
|
|
|
114
114
|
"/toolEngine/targetedInvestmentPromotion/get_reach_chain",
|
|
115
115
|
"/ike2b/user/WXOA/bind", "/ike2b/select/park/park_list",
|
|
116
116
|
"/ike2b/pool/company/area_distribution/park_company_count_by_special_tag"]
|
|
117
|
+
# 飞书 webhook URL 常量定义 用于向指定的飞书机器人发送消息的 webhook 地址
|
|
118
|
+
LIMIT_FS_WEBHOOK_URL = "https://open.feishu.cn/open-apis/bot/v2/hook/545140ef-8234-4167-9f0c-8ee72abae430"
|
|
119
|
+
#
|
|
117
120
|
#
|
|
118
121
|
# # 外网地址
|
|
119
122
|
# OUTSIDE_SCREEN_IP: str = ""
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
|
|
3
|
+
import json
|
|
4
|
+
|
|
5
|
+
import requests
|
|
6
|
+
|
|
7
|
+
logger = logging.getLogger(__name__)
|
|
8
|
+
|
|
9
|
+
def fs_webhook(webhook_url:str,title:str, content:[str,list]):
|
|
10
|
+
"""
|
|
11
|
+
发送飞书 webhook 消息
|
|
12
|
+
|
|
13
|
+
参数:
|
|
14
|
+
webhook_url (str): 飞书 webhook 的 URL 地址
|
|
15
|
+
title (str): 消息的标题
|
|
16
|
+
content (str or list): 消息内容,可以是字符串或字符串列表
|
|
17
|
+
|
|
18
|
+
返回值:
|
|
19
|
+
无返回值,直接发送 HTTP 请求
|
|
20
|
+
"""
|
|
21
|
+
headers = {'Content-Type': 'application/json;charset=utf-8'}
|
|
22
|
+
|
|
23
|
+
# 根据内容类型构建飞书消息格式
|
|
24
|
+
if isinstance(content, list):
|
|
25
|
+
fs_content = []
|
|
26
|
+
for i in content:
|
|
27
|
+
fs_content.append({
|
|
28
|
+
"tag": "text",
|
|
29
|
+
"text": f"{i}\n"
|
|
30
|
+
})
|
|
31
|
+
else:
|
|
32
|
+
fs_content = [{
|
|
33
|
+
"tag": "text",
|
|
34
|
+
"text": f"{content}\n"
|
|
35
|
+
}]
|
|
36
|
+
|
|
37
|
+
# 构造飞书消息的 JSON 结构
|
|
38
|
+
json_text = {
|
|
39
|
+
"msg_type": "post",
|
|
40
|
+
"content": {
|
|
41
|
+
"post": {
|
|
42
|
+
"zh_cn": {
|
|
43
|
+
"title": title,
|
|
44
|
+
"content": [
|
|
45
|
+
fs_content
|
|
46
|
+
]
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
# 发送 POST 请求并记录响应结果
|
|
53
|
+
result = requests.post(webhook_url, json.dumps(json_text), headers=headers).content
|
|
54
|
+
logger.info(result)
|
|
55
|
+
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import time
|
|
2
|
+
import logging
|
|
3
|
+
|
|
4
|
+
from flask import current_app, request
|
|
5
|
+
|
|
6
|
+
from lesscode_flask.model.response_result import ResponseResult
|
|
7
|
+
from lesscode_flask.model.user import flask_login
|
|
8
|
+
from lesscode_flask.utils.fs_util import fs_webhook
|
|
9
|
+
from lesscode_flask.utils.redis.redis_helper import RedisHelper
|
|
10
|
+
|
|
11
|
+
logger = logging.getLogger(__name__)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class RateLimitHandler:
|
|
15
|
+
"""
|
|
16
|
+
限流后的处理函数实现
|
|
17
|
+
"""
|
|
18
|
+
def __init__(self, req, delay: float, excess: float):
|
|
19
|
+
"""
|
|
20
|
+
初始化
|
|
21
|
+
:param req:
|
|
22
|
+
:param delay: 延迟时间
|
|
23
|
+
:param excess: 超出数量
|
|
24
|
+
"""
|
|
25
|
+
self.req = req
|
|
26
|
+
self.delay = delay
|
|
27
|
+
self.excess = excess
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def response_handler(self):
|
|
31
|
+
# 如果配置了飞书 webhook URL,则发送告警通知
|
|
32
|
+
limit_fs_webhook_url = current_app.config.get("LIMIT_FS_WEBHOOK_URL")
|
|
33
|
+
# 如果配置了飞书 webhook URL,则发送告警通知
|
|
34
|
+
if limit_fs_webhook_url:
|
|
35
|
+
content = []
|
|
36
|
+
current_user = flask_login.current_user
|
|
37
|
+
# 收集用户相关信息
|
|
38
|
+
content.append(f"用户名称:{current_user.display_name}")
|
|
39
|
+
phone_no = current_user.phone_no if current_user.phone_no is not None else "-"
|
|
40
|
+
content.append(f"手机号:{phone_no}")
|
|
41
|
+
content.append(f"用户IP:{request.remote_addr}")
|
|
42
|
+
content.append(f"资源地址:{request.url_rule.rule}")
|
|
43
|
+
|
|
44
|
+
# 发送飞书 webhook 告警
|
|
45
|
+
fs_webhook(limit_fs_webhook_url, "触发频率限流告警", content)
|
|
46
|
+
return ResponseResult.fail(status_code="403", http_code="403", message="请求过于频繁,请稍后再试!")
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
|
|
3
|
+
from flask import current_app, request
|
|
4
|
+
|
|
5
|
+
from lesscode_flask.model.response_result import ResponseResult
|
|
6
|
+
from lesscode_flask.model.user import flask_login
|
|
7
|
+
from lesscode_flask.utils.fs_util import fs_webhook
|
|
8
|
+
|
|
9
|
+
logger = logging.getLogger(__name__)
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class CountLimitHandler:
|
|
13
|
+
"""
|
|
14
|
+
限流后的处理函数实现
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
def __init__(self, req, remaining):
|
|
18
|
+
self.req = req
|
|
19
|
+
self.remaining = remaining
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def response_handler(self):
|
|
23
|
+
"""
|
|
24
|
+
处理请求频率超限的响应
|
|
25
|
+
|
|
26
|
+
该函数用于当用户请求过于频繁触发限流时,返回相应的错误响应。
|
|
27
|
+
同时会发送告警信息到飞书 webhook,记录相关用户和请求信息。
|
|
28
|
+
|
|
29
|
+
Returns:
|
|
30
|
+
ResponseResult: 包含403状态码和错误信息的响应结果
|
|
31
|
+
"""
|
|
32
|
+
limit_fs_webhook_url = current_app.config.get("LIMIT_FS_WEBHOOK_URL")
|
|
33
|
+
# 如果配置了飞书 webhook URL,则发送告警通知
|
|
34
|
+
if limit_fs_webhook_url:
|
|
35
|
+
content = []
|
|
36
|
+
current_user = flask_login.current_user
|
|
37
|
+
# 收集用户相关信息
|
|
38
|
+
content.append(f"用户名称:{current_user.display_name}")
|
|
39
|
+
phone_no = current_user.phone_no if current_user.phone_no is not None else "-"
|
|
40
|
+
content.append(f"手机号:{phone_no}")
|
|
41
|
+
content.append(f"用户IP:{request.remote_addr}")
|
|
42
|
+
content.append(f"资源地址:{request.url_rule.rule}")
|
|
43
|
+
|
|
44
|
+
# 发送飞书 webhook 告警
|
|
45
|
+
fs_webhook(limit_fs_webhook_url, "触发总量限流告警", content)
|
|
46
|
+
return ResponseResult.fail(status_code="403", http_code="403", message="请求过于频繁,请稍后再试!")
|
|
@@ -27,8 +27,8 @@ lesscode_flask/service/resource_param_template_service.py
|
|
|
27
27
|
lesscode_flask/setting/__init__.py
|
|
28
28
|
lesscode_flask/setup/__init__.py
|
|
29
29
|
lesscode_flask/static/swagger.py
|
|
30
|
-
lesscode_flask/utils/__init__.py
|
|
31
30
|
lesscode_flask/utils/dify_utils.py
|
|
31
|
+
lesscode_flask/utils/fs_util.py
|
|
32
32
|
lesscode_flask/utils/helpers.py
|
|
33
33
|
lesscode_flask/utils/decorator/__init__.py
|
|
34
34
|
lesscode_flask/utils/decorator/cache.py
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import time
|
|
2
|
-
import logging
|
|
3
|
-
|
|
4
|
-
from lesscode_flask.model.response_result import ResponseResult
|
|
5
|
-
from lesscode_flask.utils.redis.redis_helper import RedisHelper
|
|
6
|
-
|
|
7
|
-
logger = logging.getLogger(__name__)
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
class RateLimitHandler:
|
|
11
|
-
"""
|
|
12
|
-
限流后的处理函数实现
|
|
13
|
-
"""
|
|
14
|
-
def __init__(self, req, delay: float, excess: float):
|
|
15
|
-
"""
|
|
16
|
-
初始化
|
|
17
|
-
:param req:
|
|
18
|
-
:param delay: 延迟时间
|
|
19
|
-
:param excess: 超出数量
|
|
20
|
-
"""
|
|
21
|
-
self.req = req
|
|
22
|
-
self.delay = delay
|
|
23
|
-
self.excess = excess
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
def response_handler(self):
|
|
27
|
-
message = "请求过于频繁,请稍后再试"
|
|
28
|
-
return ResponseResult.fail(status_code="403", http_code="403", message=message)
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import logging
|
|
2
|
-
|
|
3
|
-
from lesscode_flask.model.response_result import ResponseResult
|
|
4
|
-
|
|
5
|
-
logger = logging.getLogger(__name__)
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
class CountLimitHandler:
|
|
9
|
-
"""
|
|
10
|
-
限流后的处理函数实现
|
|
11
|
-
"""
|
|
12
|
-
|
|
13
|
-
def __init__(self, req, remaining):
|
|
14
|
-
self.req = req
|
|
15
|
-
self.remaining = remaining
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
def response_handler(self):
|
|
19
|
-
message = "请求过于频繁,请稍后再试!"
|
|
20
|
-
return ResponseResult.fail(status_code="403", http_code="403", message=message)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{lesscode_flask-0.2.7 → lesscode_flask-0.2.9}/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.2.7 → lesscode_flask-0.2.9}/lesscode_flask/model/resource_param_template.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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{lesscode_flask-0.2.7 → lesscode_flask-0.2.9}/lesscode_flask/utils/json/NotSortJSONProvider.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{lesscode_flask-0.2.7 → lesscode_flask-0.2.9}/lesscode_flask/utils/limit/req/redis_rate_limiter.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
|
{lesscode_flask-0.2.7 → lesscode_flask-0.2.9}/lesscode_flask/utils/swagger/swagger_template.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
|
|
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
|