获取 FastAPI 响应的内容长度

Get content-length of FastAPI response

我正在尝试在服务器端获取 FastAPI 响应的内容长度以进行日志记录。这可能吗?谢谢

@app.get("/foo")
async def foo(background_tasks: BackgroundTasks):

  data = {"foo": "foo"}

  response_content_length = get_content_length()

  background_tasks.add_task(log, response_content_length ) 

  return data

您可以通过继承 APIRoute class 创建自己的路由,现在您应该可以记录所有内容,而无需重复自己。

from fastapi import FastAPI, Request, Response, Body, BackgroundTasks, APIRouter
from fastapi.routing import APIRoute

from typing import Callable, List



class ContextIncludedRoute(APIRoute):
    def get_route_handler(self) -> Callable:
        original_route_handler = super().get_route_handler()

        async def custom_route_handler(request: Request) -> Response:

            response: Response = await original_route_handler(request)

            content_length = response.headers["content-length"]
            print(content_length)
            
            return response

        return custom_route_handler


app = FastAPI()
router = APIRouter(route_class=ContextIncludedRoute)


@router.post("/dummy")
async def dummy():
    return {"foo":"foo"}


app.include_router(router)