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

获取请求和响应

@app.middleware("http")
async def log_request_and_response(request: Request, call_next) -> Response:
    data = {
        "client": request.client[0],
        "method": request.method,
        "path": request.url.path,
        "params": dict(request.query_params),
        "body": await request.body(),
    }
 
    response = await call_next(request)
    response_body = b""
    async for chunk in response.body_iterator:
        response_body += chunk
 
    data["data"] = response_body.decode()[:256]
    ilog.info(data)
 
    return Response(
        content=response_body,
        status_code=response.status_code,
        headers=dict(response.headers),
        media_type=response.media_type,
    )
 

部分 POST 请求无响应的解决方案:

 async def set_body(request: Request, body: bytes):
     async def receive() -> Message:
         return {"type": "http.request", "body": body}
     request._receive = receive
 
 async def get_body(request: Request) -> bytes:
     body = await request.body()
     await set_body(request, body)
     return body
 
 @app.middleware("http")
 async def app_entry(request: Request, call_next):
     
     await set_body(request, request.body())
 
     print(await get_body(request))
 
     response = await call_next(request)
     return response