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
    })
→ Ссылка