我正在尝试为 FastAPI 项目编写中间件,在某些特殊情况下操作请求标头和/或查询参数。
我已经设法捕获并修改了中间件中的请求对象,但似乎即使我修改了传递给中间件的请求对象,服务端点的函数也会收到原始的、未修改的请求。
这是我的实现的简化版本:
from fastapi import FastAPI, Request
from starlette.datastructures import MutableHeaders, QueryParams
from starlette.middleware.base import BaseHTTPMiddleware
class TestMiddleware(BaseHTTPMiddleware):
def __init__(self, app: FastAPI):
super().__init__(app)
def get_modified_query_params(request: Request) -> QueryParams:
pass ## Create and return new query params
async def dispatch(
self, request: Request, call_next, *args, **kwargs
) -> None:
# Check and manipulate the X-DEVICE-TOKEN if required
header_key = "X-DEVICE-INFo"
new_header_value = "new device info"
new_header = MutableHeaders(request._headers)
new_header[header_key] = new_header_value
request._headers = new_header
request._query_params = self.get_modified_query_params(request)
print("modified headers =>", request.headers)
print("modified params =>", request.query_params)
return await call_next(request)
即使我在上面的打印语句中看到了更新的值,当我尝试在服务于端点的函数中打印请求对象时,我看到了请求的原始值。
我错过了什么?