Skip to content

中间人: 中间件与 CORS

Middleware 是一个函数,它在任何特定路径操作处理请求之前处理每个请求,并在响应返回之前处理每个响应。它位于客户端和应用程序逻辑之间。

您可以使用 Middleware 来:

  • 修改或检查请求头。
  • 处理请求体。
  • 测量执行时间。
  • 记录请求。
  • 修改响应头。

要在 FastAPI 中创建 Middleware,您可以使用 @app.middleware("http") 装饰器。Middleware 函数接受两个参数:request 对象和 call_next 函数。

call_next 函数会将请求传递给相应的路径操作,并返回由它生成的响应。

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

最常见的 Middleware 要求之一是处理 CORS。如果您的前端(例如 React 应用程序)运行在 http://localhost:3000 上,而您的 FastAPI 后端运行在 http://localhost:8000 上,出于安全原因,Web 浏览器默认会阻止前端到后端的请求。这被称为同源策略。

为了允许您的前端与后端通信,您必须明确配置 CORS,以告知浏览器哪些源(域)被允许访问您的 API。

FastAPI 提供了一个内置的 CORSMiddleware 来轻松处理这个问题。您应该将其作为第一个 Middleware 添加,以确保它能正确捕获 OPTIONS 请求。

from fastapi.middleware.cors import CORSMiddleware
origins = [
"http://localhost.tiangolo.com",
"https://localhost.tiangolo.com",
"http://localhost",
"http://localhost:8080",
]
app.add_middleware(
CORSMiddleware,
allow_origins=origins,
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)

在此配置中:

  • allow_origins:允许发出请求的源列表。您可以使用 ["*"] 允许所有源,但指定列表更安全。
  • allow_methods:允许的 HTTP 方法(GET、POST 等)。["*"] 允许所有方法。
  • allow_headers:允许的特定 HTTP 请求头。