优化更新

This commit is contained in:
2026-09-13 23:01:19 +08:00
parent 0c67b3e8b5
commit 23bd737b82
88 changed files with 2214 additions and 2503 deletions
@@ -5,7 +5,7 @@
## 请求链路总览
:::tip 链路概览
一个典型的 API 请求经过以下阶段:浏览器 → Nginx → CORS → 限流 → Redis 注入 → DB 会话 → 操作日志 → 路由匹配 → JWT 认证 → RBAC 鉴权 → WTForms 校验 → Router → Service → Repository → DB → 响应序列化 → 中间件反向链 → 浏览器
一个典型的 API 请求经过以下阶段:浏览器 → Nginx → CORS → Redis 注入 → DB 会话 → 操作日志 → 路由匹配 → JWT 认证 → RBAC 鉴权 → WTForms 校验 → Router → Service → Repository → DB → 响应序列化 → 中间件反向链 → 浏览器
:::
以下以 `POST /api/v1/position/add` 添加岗位为例,逐步拆解完整链路。
@@ -49,37 +49,25 @@ Nginx 将请求代理到 Flask 服务,同时附加客户端真实 IP 到 `X-Fo
Flask 的中间件通过 `before_request` / `after_request` 钩子实现。请求从最外层进入,逐层穿透到路由处理函数,响应沿反向链返回。
### 3. CORS 跨域中间件(最外层)
### 3. CORS 跨域配置(最外层)
```python
# src/middleware/cors.py
register_cors(app) # 注册 CORS 中间件
# src/app.py - create_app()
from flask_cors import CORS
from config import CORS_ALLOWED_ORIGINS
if CORS_ALLOWED_ORIGINS:
allowed_origins = [origin.strip() for origin in CORS_ALLOWED_ORIGINS.split(',') if origin.strip()]
CORS(app, resources={r"/*": {"origins": allowed_origins}}, supports_credentials=True)
else:
CORS(app, resources={r"/*": {"origins": "*"}}, supports_credentials=False)
```
- 检查 `Origin` 头是否在允许列表中
- 预检请求(OPTIONS)直接返回 CORS 响应头
- 普通请求附加 `Access-Control-Allow-*` 响应头
### 4. 请求限流中间件
```python
# src/middleware/rate_limit.py
@app.before_request
def rate_limit():
if not RATE_LIMIT_ENABLED:
return
# 滑动窗口计数器(Redis Lua 原子操作)
count = sliding_window_incr(redis, current_key, prev_key, ...)
if count > RATE_LIMIT_LIMIT:
return R.failed("请求过于频繁,请稍后再试")
```
- 基于客户端 IP 的滑动窗口计数器
- 使用 Redis Lua 脚本保证原子性
- 超限直接返回统一 JSON 响应,不进入后续链路
- Redis 不可用时降级放行(fail-open)
### 5. Redis 上下文注入中间件
### 4. Redis 上下文注入中间件
```python
# src/core/redis_client.py
@@ -351,8 +339,7 @@ R.ok(msg='添加成功')
2. **操作日志**:记录写操作日志到数据库
3. **DB 会话**:检测 `code==0`,执行 `db.session.commit()`
4. **Redis 上下文**:无操作(g 对象自动清理)
5. **限流**:无操作(响应直接透传)
6. **CORS**:附加 `Access-Control-Allow-*` 响应头
5. **CORS**:附加 `Access-Control-Allow-*` 响应头
### 20. 浏览器接收响应
@@ -381,10 +368,6 @@ R.ok(msg='添加成功')
[CORS 中间件] ── 跨域校验通过
│
▼
[限流中间件] ── 滑动窗口计数(Redis)
│ ├─ 超限 → 直接返回失败
│ └─ 通过 ▼
▼
[DB 会话中间件] ── 标记事务活跃
│
▼
@@ -421,7 +404,7 @@ R.ok(msg='添加成功')
└─ 业务失败(code≠0)→ rollback 回滚事务
│
▼
[限流] → [CORS] → [Nginx]
[CORS] → [Nginx]
│
▼
[浏览器] ← JSON 响应({ code, data, msg, ok })
@@ -443,4 +426,4 @@ R.ok(msg='添加成功')
## 总结
一个 API 请求从浏览器到数据库经过 7 个阶段、20+ 个处理节点。中间件链负责横切关注点(安全、限流、日志、事务),路由层负责认证鉴权,WTForms 负责参数校验,三层架构负责业务逻辑与数据访问。这种分层设计使得每一层职责单一、可独立测试,系统在高并发场景下仍能保持稳定的性能和可靠的事务一致性。
一个 API 请求从浏览器到数据库经过 7 个阶段、20+ 个处理节点。中间件链负责横切关注点(安全、日志、事务),路由层负责认证鉴权,WTForms 负责参数校验,三层架构负责业务逻辑与数据访问。这种分层设计使得每一层职责单一、可独立测试,系统在高并发场景下仍能保持稳定的性能和可靠的事务一致性。