您可以将中间件添加到FastAPI应用程序。
“中间件”是一种功能,该功能可在任何请求通过任何特定路径操作处理之前与每个请求一起使用。以及返回之前的每个响应。

  • 它接受应用程序中的每个请求。
  • 它可以对该请求执行某些操作或运行任何需要的代码。
  • 它传递要由应用程序其余部分处理的请求(通过某些路径操作)。
  • 它将获取应用程序生成的响应(通过某些路径操作)。
  • 它可以对响应做出响应或运行任何需要的代码。然后返回响应。


:::tips 详细教程
如果您对yield具有依赖性,则退出代码将在中间件之后运行。
如果有任何后台任务(稍后说明),它们将在所有中间件之后运行。 :::

创建一个中间件

要创建中间件,请在函数顶部使用装饰器@app.middleware("http")
中间件功能:

  • request
  • 函数call_next将接收请求作为参数。
    • 该函数会将请求传递给相应的路径操作。
    • 它返回由相应路径操作生成的响应
  • 您可以在返回之前进一步修改响应。
    1. import time
    2. from fastapi import FastAPI, Request
    3. app = FastAPI()
    4. @app.middleware("http")
    5. async def add_process_time_header(request: Request, call_next):
    6. start_time = time.time()
    7. response = await call_next(request)
    8. process_time = time.time() - start_time
    9. response.headers["X-Process-Time"] = str(process_time)
    10. return response

    :::info 提示
    请记住,可以使用”X-“前缀添加自定义专有头部信息。
    但是,如果您希望浏览器中的客户端能够看到自定义标头,则需要使用Starlette的CORS文档中记录的参数Exposure_headers将它们添加到CORS配置(CORS(跨源资源共享))中。 :::
    :::info 详细教程
    你也可以使用from strlette.requests import Request
    FastAPI为开发人员提供了便利。但它直接来自Starlette。 :::

    response之前和之后

    您可以在任何路径操作收到request之前添加要与该请求一起运行的代码。
    并且在生成响应之后,在返回响应之前。
    例如,您可以添加一个自定义标头X-Process-Time,其中包含处理请求和生成响应所花费的时间(以秒为单位):
    1. import time
    2. from fastapi import FastAPI, Request
    3. app = FastAPI()
    4. @app.middleware("http")
    5. async def add_process_time_header(request: Request, call_next):
    6. start_time = time.time()
    7. response = await call_next(request)
    8. process_time = time.time() - start_time
    9. response.headers["X-Process-Time"] = str(process_time)
    10. return response

    其他中间件

    稍后,您可以在《高级用户指南:高级中间件》中了解有关其他中间件的更多信息。
    您将在下一部分中了解如何使用中间件处理CORS。