中间件¶
FastAPI 支持中间件。
中间件是在路径操作处理请求前及响应返回前执行的函数。
- 接收应用的每个请求
- 处理请求
- (通过路径操作)把请求传递给应用的其他组件
- (通过路径操作)获取应用的响应
- 处理响应
- 返回响应
技术细节
使用 yield
关键字依赖项时, 依赖项中的退出代码在执行中间件后执行。
后台任务(稍后介绍)在执行中间件后运行。
创建中间件¶
在函数顶部使用装饰器 @app.middleware("http")
,即可创建中间件。
中间件接收如下参数:
request
- 函数
call_next
接收参数request
- 函数把
request
传递给相应的路径操作 - 然后返回由相应的路径操作生成的
response
- 函数把
- 然后在返回
response
前进一步修改
import time
from fastapi import FastAPI, Request
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
提示
注意,可以使用'X-' 前缀添加专用的自定义请求头。
但如果想让浏览器中的客户端识别自定义请求头,则要把它们加到 CORS 配置 (CORS (Cross-Origin Resource Sharing)) 的 expose_headers
参数中,详见 Starlette 的 CORS 文档。
技术细节
您也可以使用 from starlette.requests import Request
。
FastAPI 为了开发者方便提供了该对象,但它直接继承自 Starlette。
response
前后¶
在路径操作接收 request
前,添加与请求一起运行的代码。
也可以在响应生成后,返回前添加代码。
例如,添加自定义请求头 X-Process-Time
,包含接收请求和生成响应的时间(秒):
import time
from fastapi import FastAPI, Request
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
其他中间件¶
高级用户指南:高级中间件一章中介绍了更多中间件。
下一章,介绍如何使用中间件处理 CORS(跨域资源共享)。