mdbq 4.2.20__tar.gz → 4.2.22__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.
Potentially problematic release.
This version of mdbq might be problematic. Click here for more details.
- {mdbq-4.2.20 → mdbq-4.2.22}/PKG-INFO +1 -1
- mdbq-4.2.22/mdbq/__version__.py +1 -0
- {mdbq-4.2.20 → mdbq-4.2.22}/mdbq/auth/auth_backend.py +0 -1
- {mdbq-4.2.20 → mdbq-4.2.22}/mdbq/redis/redis_cache.py +4 -9
- {mdbq-4.2.20 → mdbq-4.2.22}/mdbq/route/monitor.py +32 -9
- {mdbq-4.2.20 → mdbq-4.2.22}/mdbq.egg-info/PKG-INFO +1 -1
- mdbq-4.2.20/mdbq/__version__.py +0 -1
- {mdbq-4.2.20 → mdbq-4.2.22}/README.txt +0 -0
- {mdbq-4.2.20 → mdbq-4.2.22}/mdbq/__init__.py +0 -0
- {mdbq-4.2.20 → mdbq-4.2.22}/mdbq/auth/__init__.py +0 -0
- {mdbq-4.2.20 → mdbq-4.2.22}/mdbq/auth/crypto.py +0 -0
- {mdbq-4.2.20 → mdbq-4.2.22}/mdbq/auth/rate_limiter.py +0 -0
- {mdbq-4.2.20 → mdbq-4.2.22}/mdbq/js/__init__.py +0 -0
- {mdbq-4.2.20 → mdbq-4.2.22}/mdbq/js/jc.py +0 -0
- {mdbq-4.2.20 → mdbq-4.2.22}/mdbq/log/__init__.py +0 -0
- {mdbq-4.2.20 → mdbq-4.2.22}/mdbq/log/mylogger.py +0 -0
- {mdbq-4.2.20 → mdbq-4.2.22}/mdbq/myconf/__init__.py +0 -0
- {mdbq-4.2.20 → mdbq-4.2.22}/mdbq/myconf/myconf.py +0 -0
- {mdbq-4.2.20 → mdbq-4.2.22}/mdbq/mysql/__init__.py +0 -0
- {mdbq-4.2.20 → mdbq-4.2.22}/mdbq/mysql/deduplicator.py +0 -0
- {mdbq-4.2.20 → mdbq-4.2.22}/mdbq/mysql/mysql.py +0 -0
- {mdbq-4.2.20 → mdbq-4.2.22}/mdbq/mysql/s_query.py +0 -0
- {mdbq-4.2.20 → mdbq-4.2.22}/mdbq/mysql/unique_.py +0 -0
- {mdbq-4.2.20 → mdbq-4.2.22}/mdbq/mysql/uploader.py +0 -0
- {mdbq-4.2.20 → mdbq-4.2.22}/mdbq/other/__init__.py +0 -0
- {mdbq-4.2.20 → mdbq-4.2.22}/mdbq/other/download_sku_picture.py +0 -0
- {mdbq-4.2.20 → mdbq-4.2.22}/mdbq/other/error_handler.py +0 -0
- {mdbq-4.2.20 → mdbq-4.2.22}/mdbq/other/otk.py +0 -0
- {mdbq-4.2.20 → mdbq-4.2.22}/mdbq/other/pov_city.py +0 -0
- {mdbq-4.2.20 → mdbq-4.2.22}/mdbq/other/ua_sj.py +0 -0
- {mdbq-4.2.20 → mdbq-4.2.22}/mdbq/pbix/__init__.py +0 -0
- {mdbq-4.2.20 → mdbq-4.2.22}/mdbq/pbix/pbix_refresh.py +0 -0
- {mdbq-4.2.20 → mdbq-4.2.22}/mdbq/pbix/refresh_all.py +0 -0
- {mdbq-4.2.20 → mdbq-4.2.22}/mdbq/redis/__init__.py +0 -0
- {mdbq-4.2.20 → mdbq-4.2.22}/mdbq/redis/getredis.py +0 -0
- {mdbq-4.2.20 → mdbq-4.2.22}/mdbq/route/__init__.py +0 -0
- {mdbq-4.2.20 → mdbq-4.2.22}/mdbq/route/analytics.py +0 -0
- {mdbq-4.2.20 → mdbq-4.2.22}/mdbq/route/routes.py +0 -0
- {mdbq-4.2.20 → mdbq-4.2.22}/mdbq/selenium/__init__.py +0 -0
- {mdbq-4.2.20 → mdbq-4.2.22}/mdbq/selenium/get_driver.py +0 -0
- {mdbq-4.2.20 → mdbq-4.2.22}/mdbq/spider/__init__.py +0 -0
- {mdbq-4.2.20 → mdbq-4.2.22}/mdbq.egg-info/SOURCES.txt +0 -0
- {mdbq-4.2.20 → mdbq-4.2.22}/mdbq.egg-info/dependency_links.txt +0 -0
- {mdbq-4.2.20 → mdbq-4.2.22}/mdbq.egg-info/top_level.txt +0 -0
- {mdbq-4.2.20 → mdbq-4.2.22}/setup.cfg +0 -0
- {mdbq-4.2.20 → mdbq-4.2.22}/setup.py +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
VERSION = '4.2.22'
|
|
@@ -919,8 +919,8 @@ def flask_redis_cache(cache_key_func=None, ttl=1200, namespace="default",
|
|
|
919
919
|
# 如果没有Flask环境,直接执行原函数
|
|
920
920
|
return func(*args, **kwargs)
|
|
921
921
|
|
|
922
|
-
#
|
|
923
|
-
g.data_source = '
|
|
922
|
+
# 初始化数据源标记
|
|
923
|
+
g.data_source = 'mysql'
|
|
924
924
|
g.cache_hit = False
|
|
925
925
|
|
|
926
926
|
# 获取缓存系统
|
|
@@ -928,9 +928,7 @@ def flask_redis_cache(cache_key_func=None, ttl=1200, namespace="default",
|
|
|
928
928
|
|
|
929
929
|
# 如果缓存系统不可用,直接执行原函数
|
|
930
930
|
if not cache_system:
|
|
931
|
-
#
|
|
932
|
-
g.data_source = 'mysql'
|
|
933
|
-
g.cache_hit = False
|
|
931
|
+
# 直接查询数据库(无缓存系统)
|
|
934
932
|
return func(*args, **kwargs)
|
|
935
933
|
|
|
936
934
|
try:
|
|
@@ -967,10 +965,7 @@ def flask_redis_cache(cache_key_func=None, ttl=1200, namespace="default",
|
|
|
967
965
|
if not skip_cache_on_error:
|
|
968
966
|
raise
|
|
969
967
|
|
|
970
|
-
#
|
|
971
|
-
# 标记为 mysql 查询
|
|
972
|
-
g.data_source = 'mysql'
|
|
973
|
-
g.cache_hit = False
|
|
968
|
+
# 缓存未命中,执行原函数
|
|
974
969
|
result = func(*args, **kwargs)
|
|
975
970
|
|
|
976
971
|
# 如果结果是Flask Response对象,提取JSON数据进行缓存
|
|
@@ -19,6 +19,7 @@ import threading
|
|
|
19
19
|
import pymysql
|
|
20
20
|
import functools
|
|
21
21
|
import hashlib
|
|
22
|
+
import socket
|
|
22
23
|
from datetime import datetime, timedelta
|
|
23
24
|
from typing import Dict, Any, Optional
|
|
24
25
|
from dbutils.pooled_db import PooledDB # type: ignore
|
|
@@ -123,7 +124,7 @@ class RouteMonitor:
|
|
|
123
124
|
with connection.cursor() as cursor:
|
|
124
125
|
cursor.execute(
|
|
125
126
|
f"CREATE DATABASE IF NOT EXISTS `{self.database}` "
|
|
126
|
-
f"DEFAULT CHARACTER SET utf8mb4 COLLATE
|
|
127
|
+
f"DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci"
|
|
127
128
|
)
|
|
128
129
|
cursor.execute(f"USE `{self.database}`")
|
|
129
130
|
finally:
|
|
@@ -145,7 +146,7 @@ class RouteMonitor:
|
|
|
145
146
|
except Exception:
|
|
146
147
|
cursor.execute(
|
|
147
148
|
f"CREATE DATABASE IF NOT EXISTS `{self.database}` "
|
|
148
|
-
f"DEFAULT CHARACTER SET utf8mb4 COLLATE
|
|
149
|
+
f"DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci"
|
|
149
150
|
)
|
|
150
151
|
cursor.execute(f"USE `{self.database}`")
|
|
151
152
|
|
|
@@ -174,6 +175,8 @@ class RouteMonitor:
|
|
|
174
175
|
`请求方法` VARCHAR(10) NOT NULL COMMENT 'HTTP 方法(GET/POST/PUT/DELETE等)',
|
|
175
176
|
`路由地址` VARCHAR(500) NOT NULL COMMENT 'API 路由地址',
|
|
176
177
|
`客户端ip` VARCHAR(45) NOT NULL COMMENT '客户端 ip 地址(支持 IPv6)',
|
|
178
|
+
`主机名` VARCHAR(100) COMMENT '服务器主机名',
|
|
179
|
+
`请求来源` VARCHAR(500) COMMENT '请求来源(Referer)',
|
|
177
180
|
`状态码` SMALLINT COMMENT 'HTTP 状态码',
|
|
178
181
|
`响应耗时` DECIMAL(10,3) COMMENT '请求处理耗时(毫秒)',
|
|
179
182
|
`数据源` VARCHAR(20) COMMENT '数据源类型:redis/mysql/hybrid/none',
|
|
@@ -189,13 +192,15 @@ class RouteMonitor:
|
|
|
189
192
|
INDEX `idx_请求时间` (`请求时间`),
|
|
190
193
|
INDEX `idx_路由地址` (`路由地址`(191)),
|
|
191
194
|
INDEX `idx_客户端ip` (`客户端ip`),
|
|
195
|
+
INDEX `idx_主机名` (`主机名`),
|
|
192
196
|
INDEX `idx_状态码` (`状态码`),
|
|
193
197
|
INDEX `idx_数据源` (`数据源`),
|
|
194
198
|
INDEX `idx_缓存命中` (`缓存命中`),
|
|
195
199
|
INDEX `idx_用户标识` (`用户标识`),
|
|
196
200
|
INDEX `idx_时间_接口` (`请求时间`, `路由地址`(191)),
|
|
197
|
-
INDEX `idx_时间_数据源` (`请求时间`, `数据源`)
|
|
198
|
-
|
|
201
|
+
INDEX `idx_时间_数据源` (`请求时间`, `数据源`),
|
|
202
|
+
INDEX `idx_时间_主机` (`请求时间`, `主机名`)
|
|
203
|
+
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
|
|
199
204
|
COMMENT='API 访问日志表 - 记录每次请求的核心信息'
|
|
200
205
|
ROW_FORMAT=COMPRESSED;
|
|
201
206
|
""")
|
|
@@ -225,7 +230,7 @@ class RouteMonitor:
|
|
|
225
230
|
INDEX `idx_统计日期` (`统计日期`),
|
|
226
231
|
INDEX `idx_路由地址` (`路由地址`(191)),
|
|
227
232
|
INDEX `idx_日期_接口` (`统计日期`, `路由地址`(191))
|
|
228
|
-
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=
|
|
233
|
+
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
|
|
229
234
|
COMMENT='API 接口统计表 - 按小时汇总的接口性能数据';
|
|
230
235
|
""")
|
|
231
236
|
|
|
@@ -252,7 +257,7 @@ class RouteMonitor:
|
|
|
252
257
|
INDEX `idx_客户端ip` (`客户端ip`),
|
|
253
258
|
INDEX `idx_风险评分` (`风险评分`),
|
|
254
259
|
INDEX `idx_请求总数` (`请求总数`)
|
|
255
|
-
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=
|
|
260
|
+
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
|
|
256
261
|
COMMENT='API ip 访问记录表 - ip 维度的访问统计';
|
|
257
262
|
""")
|
|
258
263
|
connection.commit()
|
|
@@ -452,6 +457,17 @@ class RouteMonitor:
|
|
|
452
457
|
# 获取客户端 IP
|
|
453
458
|
client_ip = self.get_real_ip(request)
|
|
454
459
|
|
|
460
|
+
# 获取主机名
|
|
461
|
+
try:
|
|
462
|
+
hostname = socket.gethostname()
|
|
463
|
+
except Exception:
|
|
464
|
+
hostname = 'unknown'
|
|
465
|
+
|
|
466
|
+
# 获取请求来源(Referer)
|
|
467
|
+
referer = request.headers.get('Referer') or request.headers.get('Origin')
|
|
468
|
+
if referer and len(referer) > 500:
|
|
469
|
+
referer = referer[:500]
|
|
470
|
+
|
|
455
471
|
# 获取 User-Agent(截断过长的)
|
|
456
472
|
user_agent = request.headers.get('User-Agent', '')
|
|
457
473
|
if len(user_agent) > 500:
|
|
@@ -460,6 +476,7 @@ class RouteMonitor:
|
|
|
460
476
|
# 获取用户标识(如果有)
|
|
461
477
|
# 安全获取 user_id,允许为空时使用默认值
|
|
462
478
|
user_id = None
|
|
479
|
+
|
|
463
480
|
if hasattr(g, 'current_user_id'):
|
|
464
481
|
user_id = str(g.current_user_id) if g.current_user_id else None
|
|
465
482
|
elif hasattr(g, 'user_id'):
|
|
@@ -506,8 +523,9 @@ class RouteMonitor:
|
|
|
506
523
|
if params_dict:
|
|
507
524
|
request_params = self.sanitize_params(params_dict)
|
|
508
525
|
|
|
509
|
-
# 获取数据源信息(从 g
|
|
510
|
-
|
|
526
|
+
# 获取数据源信息(从 g 对象中读取,由缓存装饰器 redis_cache 设置)
|
|
527
|
+
# 默认为 mysql(没有使用缓存装饰器的接口直接查询数据库)
|
|
528
|
+
data_source = getattr(g, 'data_source', 'mysql')
|
|
511
529
|
cache_hit = getattr(g, 'cache_hit', False)
|
|
512
530
|
|
|
513
531
|
# 构建请求数据字典
|
|
@@ -517,6 +535,8 @@ class RouteMonitor:
|
|
|
517
535
|
'请求方法': request.method,
|
|
518
536
|
'路由地址': request.endpoint or request.path,
|
|
519
537
|
'客户端ip': client_ip,
|
|
538
|
+
'主机名': hostname,
|
|
539
|
+
'请求来源': referer,
|
|
520
540
|
'数据源': data_source,
|
|
521
541
|
'缓存命中': 1 if cache_hit else 0,
|
|
522
542
|
'用户标识': user_id,
|
|
@@ -552,10 +572,11 @@ class RouteMonitor:
|
|
|
552
572
|
sql = """
|
|
553
573
|
INSERT INTO `api_访问日志` (
|
|
554
574
|
`请求id`, `请求时间`, `请求方法`, `路由地址`, `客户端ip`,
|
|
575
|
+
`主机名`, `请求来源`,
|
|
555
576
|
`状态码`, `响应耗时`, `数据源`, `缓存命中`,
|
|
556
577
|
`用户标识`, `用户代理`, `请求参数`, `错误信息`
|
|
557
578
|
) VALUES (
|
|
558
|
-
%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s
|
|
579
|
+
%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s
|
|
559
580
|
)
|
|
560
581
|
"""
|
|
561
582
|
|
|
@@ -565,6 +586,8 @@ class RouteMonitor:
|
|
|
565
586
|
request_data.get('请求方法'),
|
|
566
587
|
request_data.get('路由地址'),
|
|
567
588
|
request_data.get('客户端ip'),
|
|
589
|
+
request_data.get('主机名'),
|
|
590
|
+
request_data.get('请求来源'),
|
|
568
591
|
request_data.get('状态码'),
|
|
569
592
|
request_data.get('响应耗时'),
|
|
570
593
|
request_data.get('数据源', 'none'),
|
mdbq-4.2.20/mdbq/__version__.py
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
VERSION = '4.2.20'
|
|
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
|
|
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
|