I have such middleware
JavaScript
x
16
16
1
class RequestContext(BaseHTTPMiddleware):
2
async def dispatch(self, request: Request, call_next: RequestResponseEndpoint):
3
request_id = request_ctx.set(str(uuid4())) # generate uuid to request
4
body = await request.body()
5
if body:
6
logger.info( ) # log request with body
7
else:
8
logger.info( ) # log request without body
9
10
response = await call_next(request)
11
response.headers['X-Request-ID'] = request_ctx.get()
12
logger.info("%s" % (response.status_code))
13
request_ctx.reset(request_id)
14
15
return response
16
So the line body = await request.body()
freezes all requests that have body and I have 504 from all of them. How can I safely read the request body in this context? I just want to log request parameters.
Advertisement
Answer
I would not create a Middleware that inherits from BaseHTTPMiddleware since it has some issues, FastAPI gives you a opportunity to create your own routers, in my experience this approach is way better.
JavaScript
1
35
35
1
from fastapi import APIRouter, FastAPI, Request, Response, Body
2
from fastapi.routing import APIRoute
3
4
from typing import Callable, List
5
from uuid import uuid4
6
7
8
class ContextIncludedRoute(APIRoute):
9
def get_route_handler(self) -> Callable:
10
original_route_handler = super().get_route_handler()
11
12
async def custom_route_handler(request: Request) -> Response:
13
request_id = str(uuid4())
14
response: Response = await original_route_handler(request)
15
16
if await request.body():
17
print(await request.body())
18
19
response.headers["Request-ID"] = request_id
20
return response
21
22
return custom_route_handler
23
24
25
app = FastAPI()
26
router = APIRouter(route_class=ContextIncludedRoute)
27
28
29
@router.post("/context")
30
async def non_default_router(bod: List[str] = Body( )):
31
return bod
32
33
34
app.include_router(router)
35
Works as expected.
JavaScript
1
3
1
b'["string"]'
2
INFO: 127.0.0.1:49784 - "POST /context HTTP/1.1" 200 OK
3