FastAPI 中间件遵循 ASGI 洋葱模型,请求按注册顺序先穿过所有中间件再进入路由,响应逆序返回。`@app.middleware("http")` 支持 `async def` 和 `def` 两种形态:`async def` 在事件循环内 `await call_next`,适合需读请求体或异步 I/O;`def` 被 Starlette 投递至线程池执行,适合纯计算,如生成请求 ID。注册顺序即为执行顺序,最先注册者离客户端最近,因此耗时统计中间件应排在最前以覆盖全部处理时间。典型设计是外层异步中间件读取 body 并计算耗时,写入 `X-Duration-ms` 等响应头;内层纯计算中间件生成唯一 ID 挂载到 `request.state` 和 `X-Request-ID`。实现需注意:`await request.body()` 会消耗请求体但 Starlette 缓存可重复读取,不适用于大文件上传;`def` 中间件不应包含同步阻塞调用;中间件数量应保持克制。
Fastapi
2
meytao