💉

FastAPI Depends() — 関数シグニチャでDIする方法

DBセッション、認証、ページネーションを関数引数として注入するパターン

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

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

Depends(get_db)がやること:エンドポイント呼び出し時にget_db()を先に実行、yieldされたdblist_usersの引数に注入。レスポンス後にfinallyブロック実行でdb.close()保証。

なぜこの設計か

  1. テスト容易性get_dbをmockに差し替えればDB不要テスト可能
  2. 再利用 — 複数エンドポイントで同じDependsを使えば重複コード排除
  3. ネスト — Depends内で他のDependsを呼べる。依存性ツリー自動解決

内部動作

FastAPIはエンドポイント関数のシグニチャをinspect.signature()で分析。Depends型のデフォルト値を見つけると呼び出しスタックに追加。generatorの場合contextlib.contextmanager的にyield前後を分離。

キーポイント

1

Depends(func)をエンドポイント引数のデフォルト値に設定

2

FastAPIがinspect.signature()でシグニチャ分析→Depends自動呼び出し

3

generator(yield)使用時:yield前=セットアップ、yield後=クリーンアップ保証

4

ネスト可能 — get_current_user → decode_token → oauth2_scheme

ユースケース

DBセッション管理 — リクエストごとにセッション生成/クローズ自動化 認証 — トークン検証をDependsで分離