优化更新
This commit is contained in:
@@ -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` 最后注册 → 最内层(最后处理请求)。
|
||||
:::
|
||||
|
||||
## 四、装饰器扩展
|
||||
|
||||
Reference in New Issue
Block a user