首页 > 后端开发 > Python教程 > 如何在 FastAPI 中高效记录原始 HTTP 请求/响应主体?

如何在 FastAPI 中高效记录原始 HTTP 请求/响应主体?

Mary-Kate Olsen
发布: 2024-12-04 06:43:17
原创
913 人浏览过

How to Efficiently Log Raw HTTP Request/Response Bodies in FastAPI?

在 Python FastAPI 中记录原始 HTTP 请求/响应

要求:

捕获并保存特定的原始 JSON 正文路由请求和响应,数据大小在 1MB 左右,不会显着影响响应时间。

选项1:利用中间件

中间件概念

中间件会在每个请求到达端点之前拦截每个请求,并在到达客户端之前进行响应,从而允许数据操作。但是,在中间件中使用请求正文流的问题是下游端点无法使用它。因此,我们将使用 set_body() 函数使其可用。

对于响应,请使用BackgroundTask

可以使用BackgroundTask 执行日志记录,这确保在响应完成后进行日志记录发送给客户端,避免响应时间延迟。

中间件示例

# Logging middleware
async def some_middleware(request: Request, call_next):
    req_body = await request.body()
    await set_body(request, req_body)
    response = await call_next(request)

    # Body storage in RAM
    res_body = b''
    async for chunk in response.body_iterator:
        res_body += chunk

    # Background logging task
    task = BackgroundTask(log_info, req_body, res_body)
    return Response(...)

# Endpoint using middleware
@app.post('/')
async def main(payload: Dict):
    pass
登录后复制

选项2:自定义APIRoute类

APIRoute类扩展

通过创建自定义APIRoute类,我们可以控制请求和响应主体,将其使用限制为通过 APIRouter 的特定路由。

重要注意事项

对于如果响应较大(例如流媒体),自定义路由可能会因将整个响应读入 RAM 而遇到 RAM 问题或客户端延迟。因此,请考虑从自定义路由中排除此类端点。

自定义 APIRoute 类示例

class LoggingRoute(APIRoute):
    async def custom_route_handler(request: Request) -> Response:
        req_body = await request.body()
        response = await original_route_handler(request)

        # Response handling based on type
        if isinstance(response, StreamingResponse):
            res_body = b''
            async for item in response.body_iterator:
                res_body += item
            response = Response(...)
        else:
            response.body

        # Logging task
        task = BackgroundTask(log_info, req_body, response.body)
        response.background = task
        return response

# Endpoint using custom APIRoute
@router.post('/')
async def main(payload: Dict):
    return payload
登录后复制

选择一个选项

这两个选项都提供了记录请求和响应数据的解决方案,而无需显着影响响应时间。选项 1 允许进行一般日志记录,而选项 2 则提供对需要日志记录的路由的精细控制。

以上是如何在 FastAPI 中高效记录原始 HTTP 请求/响应主体?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板