ホームページ >バックエンド開発 >Python チュートリアル >Python FastAPI で生の HTTP リクエストとレスポンスをログに記録する方法

Python FastAPI で生の HTTP リクエストとレスポンスをログに記録する方法

Susan Sarandon
Susan Sarandonオリジナル
2024-11-30 01:01:13463ブラウズ

How to Log Raw HTTP Requests and Responses in Python FastAPI?

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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。