FastAPIパターン
本番指向のFastAPIサービスのためのパターン。
使用するタイミング
- FastAPIアプリを構築またはレビューする場合。
- ルーター、スキーマ、依存関係、データベースアクセスを分割する場合。
- データベースや外部サービスを呼び出す非同期エンドポイントを記述する場合。
- 認証、認可、OpenAPIドキュメント、テスト、またはデプロイ設定を追加する場合。
- FastAPI PRをコピー可能な例とリスクについて確認する場合。
仕組み
FastAPIアプリを明示的な依存関係とサービスコードの上の薄いHTTPレイヤーとして扱います:
main.pyはアプリ構築、ミドルウェア、例外ハンドラー、ルーター登録を担当する。schemas/はPydanticのリクエストとレスポンスモデルを担当する。dependencies.pyはデータベース、認証、ページネーション、リクエストスコープの依存関係を担当する。services/またはcrud/はビジネスと永続化操作を担当する。tests/は本番リソースを開かずに依存関係をオーバーライドする。
小さなルーターと明示的なresponse_model宣言を優先します。レスポンススキーマには生のORMオブジェクト、シークレット、フレームワークのグローバル変数を含めないでください。
プロジェクトレイアウト
アプリケーションファクトリー
テストとワーカーが制御された設定でアプリをビルドできるように、ファクトリーを使用します。
allow_credentials=Trueと一緒にallow_origins=["*"]を使用しないでください; ブラウザはその組み合わせを拒否し、Starletteは認証情報付きリクエストに対してそれを禁止します。
Pydanticスキーマ
リクエスト、更新、レスポンスのモデルを分離します。
レスポンスモデルにはパスワードハッシュ、アクセストークン、リフレッシュトークン、内部認可状態を含めてはなりません。
依存関係
リクエストスコープのリソースには依存性注入を使用します。
ルートハンドラー内でインラインにセッション、クライアント、または認証情報を作成しないでください。
非同期エンドポイント
I/Oを実行する場合はルートハンドラーを非同期にし、その内部で非同期ライブラリを使用します。
非同期ハンドラーからの外部HTTP呼び出しにはhttpx.AsyncClientを使用してください。非同期ルートでrequestsを呼び出さないでください。
エラー処理
ドメイン例外を一元化し、レスポンスの形状を安定させます。
OpenAPIカスタマイズ
カスタムOpenAPI呼び出し可能オブジェクトをapp.openapiに割り当ててください; 関数を一度だけ呼び出さないでください。
テスト
ルートハンドラーが決して参照しない内部ヘルパーではなく、Dependsで使用される依存関係をオーバーライドします。
セキュリティチェックリスト
argon2-cffi、bcrypt、または現在のpasslib互換ハッシャーでパスワードをハッシュする。- JWTの発行者、オーディエンス、有効期限、署名アルゴリズムを検証する。
- CORSオリジンを環境固有に保つ。
- 認証と書き込み負荷の高いエンドポイントにレート制限を設ける。
- すべてのリクエストボディにPydanticモデルを使用する。
- ORMパラメーターバインディングまたはSQLAlchemy Coreの式を使用する; f文字列でSQLを構築しない。
- ログからトークン、認可ヘッダー、クッキー、パスワードを削除する。
- CIで依存関係の監査ツールを実行する。
パフォーマンスチェックリスト
- データベース接続プールを明示的に設定する。
- リストエンドポイントにページネーションを追加する。
- N+1クエリに注意し、イーガーローディングを意図的に使用する。
- 非同期パスでは非同期HTTP/データベースクライアントを使用する。
- ペイロードサイズとCPUのトレードオフを確認してから圧縮を追加する。
- 明示的な無効化の後ろで安定した高コストの読み取りをキャッシュする。
使用例
これらの例はプロジェクト全体のテンプレートではなく、パターンとして使用してください:
- アプリケーションファクトリー:
create_appでミドルウェアとルーターを一度設定する。 - スキーマの分割:
UserCreate、UserUpdate、UserResponseはそれぞれ異なる責務を持つ。 - 依存関係のオーバーライド: テストは
get_dbを直接オーバーライドする。 - OpenAPIのカスタマイズ:
app.openapi = custom_openapiを割り当てる。
関連情報
- エージェント:
fastapi-reviewer - コマンド:
/fastapi-review - スキル:
python-patterns - スキル:
python-testing - スキル:
api-design


