🐱 うさねこ教室 Python と可観測性の教室

FastAPI で実装する

🐱 この章の目次

FastAPI の特徴

FastAPI は、Python の型ヒントを活用して高速な Web API を構築するフレームワークです。 コードから OpenAPI ドキュメントが自動生成されるため、仕様と実装の乖離が起きません。 内部では Starlette(ASGI)と Pydantic(バリデーション)を基盤としています。

最小構成のアプリケーション

以下は FastAPI の最小構成です。

from fastapi import FastAPI

app = FastAPI()


@app.get("/")
async def root():
    return {"message": "Hello, usaneko!"}

uvicorn main:app --reload で起動すると、http://localhost:8000/docs に Swagger UI が表示されます。

パスパラメータとクエリパラメータ

関数の引数名がパスに含まれていればパスパラメータ、含まれていなければクエリパラメータとして解釈されます。 型ヒントがそのままバリデーションルールになります。

@app.get("/users/{user_id}")
async def get_user(user_id: int, include_posts: bool = False):
    """user_id はパスパラメータ、include_posts はクエリパラメータ"""
    return {"user_id": user_id, "include_posts": include_posts}

リクエストボディと Pydantic モデル

リクエストボディの定義には Pydantic のモデルクラスを使います。 型ヒントとフィールド制約がバリデーションとスキーマ生成を同時に担います。

from pydantic import BaseModel, Field


class UserCreate(BaseModel):
    name: str = Field(min_length=1, max_length=100)
    email: str = Field(pattern=r"^[\w.-]+@[\w.-]+\.\w+$")


@app.post("/users", status_code=201)
async def create_user(body: UserCreate):
    return {"id": 1, **body.model_dump()}

依存性注入(Dependency Injection)

依存性注入(DI) は、関数が必要とする外部リソースをフレームワークに解決させるパターンです。 FastAPI では Depends を使って DI を宣言的に記述します。

from fastapi import Depends


async def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()


@app.get("/users")
async def list_users(db: Session = Depends(get_db)):
    return db.query(User).all()

共通処理(認証、DB 接続、ページネーション)を DI に切り出すことで、ルートハンドラをシンプルに保てます。 テスト時には app.dependency_overrides でモックに差し替えられるため、単体テストも容易です。