概要
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 件のコメント:
コメントを投稿