fastapi: использовать middleware для формирования результата, в котором изначальный результат включен в качестве элемента
есть такой код:
from fastapi import FastAPI, Request
from fastapi.responses import JSONResponse
app = FastAPI()
@app.middleware("http")
async def response_middleware(request: Request, call_next):
# выполнить запрос
results = await call_next(request)
return JSONResponse(content={
'response': results
})
@app.post("/test/")
async def test_func():
results = {
'test': 10
}
return results
но выдаются ошибки
raise TypeError(f'Object of type {o.__class__.__name__} ' TypeError: Object of type
_StreamingResponse is not JSON serializable
как корректно передать results как элемент выходного словаря
нужен ли вообще JSONResponse?
думал, что можно сделать просто:
async def response_middleware(request: Request, call_next):
# выполнить запрос
results = await call_next(request)
return {
'response': results
}
но нет
Ответы (1 шт):
Автор решения: sxmrxk
→ Ссылка
Если целью является получить результат который работы какого-либо эндпоинта, то вот код который реализует это:
@app.middleware("http")
async def response_middleware(request: Request, call_next):
response = await call_next(request)
response_body = [chunk async for chunk in response.body_iterator]
response.body_iterator = iterate_in_threadpool(iter(response_body))
x = response_body[0].decode() # в переменной x будет ответ
return response
Если целью является всегда оборачивать ответ в JSON, как это сделали вы в своем примере кода. То вот пример кода:
@app.middleware("http")
async def response_middleware(request: Request, call_next):
response = await call_next(request)
response_body = [chunk async for chunk in response.body_iterator]
response.body_iterator = iterate_in_threadpool(iter(response_body))
x = response_body[0].decode()
return JSONResponse(content={
'response': x
})