跳转至

中间件

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(跨域资源共享)。