优化更新

This commit is contained in:
2026-09-13 21:53:16 +08:00
parent 8548fe9ea1
commit 3f8626fb10
84 changed files with 2058 additions and 2594 deletions
@@ -139,8 +139,8 @@ update_training_status = TrainingService.update_status
from flask import Blueprint, request
from src.core.permission import check_permission
from src.core.response import R
from src.common.utils.request import parse_request_body, parse_id_list
from src.core import response as R
from src.common.utils.request import parse_request_body, parse_batch_ids
training_blue = Blueprint('training', __name__, url_prefix='/training')
@@ -197,7 +197,7 @@ def status():
@check_permission('sys:training:batchDelete')
def batch_delete():
from src.modules.system.training.service import batch_delete_trainings
id_list = parse_id_list(request)
id_list = parse_batch_ids(request)
return batch_delete_trainings(id_list)
```
@@ -336,7 +336,7 @@ def _build_database_url(driver: str = None) -> str:
| 驱动 | 连接串格式 | Python 包 |
|:----|:----|:----|
| mysql | `mysql+pymysql://user:pass@host:port/db?charset=utf8mb4` | PyMySQL |
| postgresql | `postgresql+psycopg://user:pass@host:port/db` | psycopg[binary] |
| postgresql | `postgresql+psycopg2://user:pass@host:port/db` | psycopg2-binary |
| mssql | `mssql+pymssql://user:pass@host:port/db?charset=utf8` | pymssql |
| oracle | `oracle+oracledb://user:pass@host:port/?service_name=db` | oracledb |
| sqlite | `sqlite:///./path/to/db` | 内置 |
@@ -376,7 +376,7 @@ DB_PASSWORD=your_password
```
:::warning 驱动切换注意事项
1. 切换驱动后需安装对应的 Python 包(如 `psycopg[binary]` for PostgreSQL)
1. 切换驱动后需安装对应的 Python 包(如 `psycopg2-binary` for PostgreSQL)
2. 数据迁移使用 `scripts/migrate_db.py` 工具
3. SQLite 不支持并发写入,仅适用于开发/测试环境
4. Oracle 需要额外的客户端库配置
@@ -409,13 +409,17 @@ python scripts/migrate_db.py --src-driver mysql --src-host ... --dst-driver post
def create_app():
app = Flask(__name__)
# CORS + ProxyFix(最外层)
CORS(app, ...)
app.wsgi_app = ProxyFix(app.wsgi_app, ...)
# 先注册 → 内层(最后处理请求)
register_redis(app) # Redis 上下文注入
register_db_session(app) # DB 会话管理(commit/rollback)
register_operation_log(app) # 操作日志记录
register_transaction(app) # AOP 事务管理
register_v1(app) # 路由注册(login_required 依赖)
register_exception(app) # 全局异常处理器
register_v1(app) # 路由注册
register_extends(app) # 扩展初始化
register_middleware(app) # 登录校验 + 白名单
register_error_handlers(app) # 全局异常处理器
# 请求计时(先注册→内层,统计业务耗时)
@app.before_request
@@ -429,8 +433,7 @@ def create_app():
response.headers["X-Process-Time"] = str(round(process_time, 5))
return response
register_rate_limit(app) # 滑动窗口限流
register_cors(app) # CORS(最后注册→最外层)
CORS(app, ...) # CORS(最后注册→最外层)
return app
```
@@ -470,13 +473,13 @@ def create_app():
### 中间件执行顺序
```
请求进入 → CORS → 限流 → 上传限制 → 计时 → 操作日志 → DB会话 → Redis注入 → 路由处理
请求进入 → CORS → 上传限制 → 计时 → 操作日志 → DB会话 → Redis注入 → 路由处理
│
响应返回 ← CORS ← 限流 ← 上传限制 ← 计时 ← 操作日志 ← DB会话 ← Redis注入 ← 路由处理 ←┘
响应返回 ← CORS ← 上传限制 ← 计时 ← 操作日志 ← DB会话 ← Redis注入 ← 路由处理 ←┘
```
:::warning 中间件注册顺序
Flask 中间件按注册顺序执行。`register_cors` 最后注册 → 最外层(最先处理请求)。`register_redis` 最先注册 → 最内层(最后处理请求)。
Flask 中间件按注册顺序执行。CORS 最先配置 → 最外层(最先处理请求)。`register_middleware` 最后注册 → 最内层(最后处理请求)。
:::
## 四、装饰器扩展