2024年4月8日月曜日

fastapi にリクエストIDを自動で埋め込む方法 (RequestIdPlugin編)

fastapi にリクエストIDを自動で埋め込む方法 (RequestIdPlugin編)

概要

starlette には RequestIdPlugin という仕組みがありこれを使うと context 経由でリクエストIDを取得できます
アプリコンテキスト配下であれば同一のリクエストIDが取得できるのでロギングなどに使えます

環境

  • macOS 11.7.10
  • Python 3.11.6
    • fastapi 0.110.1
    • starlette 0.37.2
    • starlette-context 0.3.6

サンプルコード

from fastapi import FastAPI
from pydantic import BaseModel
from pydantic_settings import BaseSettings
from starlette.middleware import Middleware
from starlette_context import context
from starlette_context.middleware import RawContextMiddleware
from starlette_context.plugins.correlation_id import CorrelationIdPlugin
from starlette_context.plugins.request_id import RequestIdPlugin

# ミドルウェア定義
# これを定義することで context にリクエスト ID が自動で保持される
middleware = [
    Middleware(RawContextMiddleware, plugins=(RequestIdPlugin(), CorrelationIdPlugin()))
]
# ミドルウェア追加
app = FastAPI(middleware=middleware)


class Settings(BaseSettings):
    message: str = ""


settings = Settings()


class Item(BaseModel):
    message: str


@app.get("/")
async def get_msg():
    # コンテキスト情報からリクエストIDの取得
    return {
        "message": settings.message,
        "context": context,
    }


@app.post("/")
def set_msg(item: Item):
    settings.message = item.message
    return {"message": item.message}

最後に

RequestIdPlugin を使って fastapi にリクエストIDを自動生成する方法を紹介しました
context を使うのでアプリコンテキスト配下のモジュール出ないと参照できないのでそこは注意しましょう

参考サイト

0 件のコメント:

コメントを投稿