如何在 Python FastAPI 中记录原始 HTTP 请求/响应?
FastAPI 提供了多种方法来捕获和记录原始 HTTP 请求和响应,满足特定要求和性能考虑。
选项 1:中间件
中间件允许您拦截和处理请求和响应。您可以创建一个中间件来消耗流中的请求正文并将其存储。对于响应正文,将其读入字节对象并返回自定义响应。使用 BackgroundTask 异步记录数据,以避免影响响应时间。
示例:
async def some_middleware(request: Request, call_next): req_body = await request.body() response = await call_next(request) res_body = b'' async for chunk in response.body_iterator: res_body += chunk task = BackgroundTask(log_info, req_body, res_body) return Response(content=res_body, background=task)
选项 2:自定义 APIRoute 类
创建自定义 APIRoute 类来操作请求和响应主体。这种方法允许您将日志记录限制为 APIRouter 中定义的特定路由。
示例:
class LoggingRoute(APIRoute): async def custom_route_handler(request: Request) -> Response: req_body = await request.body() response = await original_route_handler(request) res_body = b'' async for item in response.body_iterator: res_body += item task = BackgroundTask(log_info, req_body, res_body) response = Response(content=res_body, background=task) return response
考虑在中存储大型请求/响应正文的限制内存并使用BackgroundTask来避免阻塞请求处理。如有必要,将日志记录限制为特定路由或排除返回流响应的端点。
以上是如何在 Python FastAPI 中记录原始 HTTP 请求和响应?的详细内容。更多信息请关注PHP中文网其他相关文章!