💉
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されたdbをlist_usersの引数に注入。レスポンス後にfinallyブロック実行でdb.close()保証。
なぜこの設計か
- テスト容易性 —
get_dbをmockに差し替えればDB不要テスト可能 - 再利用 — 複数エンドポイントで同じDependsを使えば重複コード排除
- ネスト — 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で分離