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 でモックに差し替えられるため、単体テストも容易です。