sas*_*ero 5 python middleware http starlette fastapi
我有这样的中间件
class RequestContext(BaseHTTPMiddleware):
async def dispatch(self, request: Request, call_next: RequestResponseEndpoint):
request_id = request_ctx.set(str(uuid4())) # generate uuid to request
body = await request.body()
if body:
logger.info(...) # log request with body
else:
logger.info(...) # log request without body
response = await call_next(request)
response.headers['X-Request-ID'] = request_ctx.get()
logger.info("%s" % (response.status_code))
request_ctx.reset(request_id)
return response
Run Code Online (Sandbox Code Playgroud)
因此该行body = await request.body()
冻结了所有具有正文的请求,而我从所有请求中获得了 504 个请求。在这种情况下如何安全地读取请求正文?我只想记录请求参数。
我不会创建一个继承自 BaseHTTPMiddleware 的中间件,因为它有一些问题,FastAPI 为您提供了创建自己的路由器的机会,根据我的经验,这种方法要好得多。
from fastapi import APIRouter, FastAPI, Request, Response, Body
from fastapi.routing import APIRoute
from typing import Callable, List
from uuid import uuid4
class ContextIncludedRoute(APIRoute):
def get_route_handler(self) -> Callable:
original_route_handler = super().get_route_handler()
async def custom_route_handler(request: Request) -> Response:
request_id = str(uuid4())
response: Response = await original_route_handler(request)
if await request.body():
print(await request.body())
response.headers["Request-ID"] = request_id
return response
return custom_route_handler
app = FastAPI()
router = APIRouter(route_class=ContextIncludedRoute)
@router.post("/context")
async def non_default_router(bod: List[str] = Body(...)):
return bod
app.include_router(router)
Run Code Online (Sandbox Code Playgroud)
按预期工作。
b'["string"]'
INFO: 127.0.0.1:49784 - "POST /context HTTP/1.1" 200 OK
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3341 次 |
最近记录: |