我正在try 为一个FastAPI项目编写一个中间件,该项目在某些特殊情况下操作请求headers
和/或query
参数.
我已经设法捕获并修改了中间件中的请求对象,但似乎即使我修改了传递给中间件的请求对象,为端点提供服务的函数也会收到原始的、未修改的请求.
以下是我的实现的简化版本:
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)
尽管我在上面的print语句中看到了更新的值,但当我try 在为端点提供服务的函数中打印请求对象时,我看到的是请求的原始值.
我遗漏了什么?