0%

FastAPI自学教程(40) - 中间件机制

1. 基础用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from fastapi import FastAPI, Request
import time

app = FastAPI()

@app.middleware("http")
async def add_process_time_header(request: Request, call_next):
start_time = time.time()
response = await call_next(request)
process_time = time.time() - start_time
response.headers["X-Process-Time"] = str(process_time)
return response

@app.get("/items/{item_id}")
async def read_item(item_id: int):
return {"item_id": item_id}
  • 使用@app.middleware("http")装饰器声明HTTP中间件
  • 中间件函数接收Request对象和call_next回调函数参数
  • 请求处理流程:
      graph TD
      A[客户端请求] --> B[中间件预处理]
      B --> C[执行路由处理函数]
      C --> D[中间件后处理]
      D --> E[返回响应]
  • 典型应用场景:请求日志、响应头修改、性能监控

2. 中间件执行流程

1
2
3
4
5
6
7
8
9
10
11
12
13
@app.middleware("http")
async def middleware_1(request: Request, call_next):
print("中间件1预处理")
response = await call_next(request)
print("中间件1后处理")
return response

@app.middleware("http")
async def middleware_2(request: Request, call_next):
print("中间件2预处理")
response = await call_next(request)
print("中间件2后处理")
return response
  • 执行顺序遵循洋葱模型:中间件注册顺序与执行顺序相反
  • 输出示例:
    1
    2
    3
    4
    中间件2预处理
    中间件1预处理
    中间件1后处理
    中间件2后处理
  • 可通过app.add_middleware()显式控制中间件顺序

3. 常用内置中间件

3.1 CORSMiddleware

1
2
3
4
5
6
7
8
from fastapi.middleware.cors import CORSMiddleware

app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_methods=["*"],
allow_headers=["*"]
)
  • 解决跨域请求问题
  • 核心参数:
    • allow_origins: 允许的源列表
    • allow_credentials: 是否允许携带凭证
    • allow_methods: 允许的HTTP方法

3.2 GZipMiddleware

1
2
from fastapi.middleware.gzip import GZipMiddleware
app.add_middleware(GZipMiddleware, minimum_size=1000)
  • 自动压缩响应数据
  • minimum_size参数控制最小压缩阈值
  • 支持文本类型(JSON/HTML/CSS/JS)压缩

4. 生产环境最佳实践

  1. 异常处理:通过中间件统一捕获未处理异常
  2. 速率限制:结合Redis实现API调用频率控制
  3. 请求验证:拦截非法请求(如黑名单IP)
  4. 日志审计:记录完整请求信息(IP/UA/路径)
  5. 性能优化:使用X-Process-Time响应头监控接口耗时

测试命令示例:

1
curl -X GET http://localhost:8000/items/42