FastAPIとは?APIを作るための実践ガイド
FastAPIは型ヒントとバリデーション、自動OpenAPIドキュメントを備えたモダンなPythonフレームワークです。基本的な使い方と適用例を学びましょう。

FastAPIを1分で:簡単な定義
FastAPIは、明確なコードと自動ドキュメントを備えた、素早くAPIを構築できるPythonのフレームワークです。小さな関数(「エンドポイント」と呼ばれます)を書き、APIが受け取るデータと返すデータを宣言すると、FastAPIがルーティング、バリデーション、JSONレスポンス生成などの「配線」を処理します。
APIとは?簡単な例
APIは、あるソフトウェアが別のソフトウェアと会話するためのURLの集合です。
例えば、あなたのスマホの天気アプリがGET /weather?city=BerlinのようなURLを呼ぶかもしれません。サーバーは温度や予報などの構造化データ(通常はJSON)で応答します。スマホアプリはサーバーのデータベースに直接アクセスする必要はなく、APIに問い合わせて結果を表示するだけです。
FastAPIはそうしたURLとレスポンスをPythonで簡単に作れるようにします。
FastAPIは誰向け?
- 初心者:大量のボイラープレートを書かずにモダンな方法でAPIを作りたい人。
- 個人開発者:素早く進めつつ可読性を保ちたい人。
- チーム:強力なバリデーション、一貫した契約、優れたドキュメントを必要とする本番サービスを構築するチーム。
非同期の専門家である必要はありません。まずはシンプルなエンドポイントを書き、必要に応じて高度なパターンを取り入れていけます。
このガイドで学べること
- FastAPIが他のPython向けAPIオプションと異なる点
- リクエストとレスポンスの仕組み(そして「async」が本当に意味すること)
- Pydanticによるデータバリデーションの仕組み
- FastAPIがOpenAPIドキュメント(Swagger UIやReDoc)を生成する仕組み
- 依存関係、セキュリティ、テスト、デプロイの基本を含むアプリ構造
なぜFastAPIが普及したのか
FastAPIは、PythonでAPIを作る際に人々が日常的に直面する摩擦を多く取り除くため、急速に受け入れられました。
よくあるAPIの問題に取り組む
従来のAPIプロジェクトは、セットアップが遅く多くの「配線」作業が必要になることが多いです:
- リクエスト解析、バリデーション、エラーメッセージを手動で書いて同期させる必要がある
- エンドポイントが正確に何を受け取り何を返すかが不明瞭になる
- チームの成長とともにドキュメントがコードと乖離する
FastAPIのコア機能はこれらの問題に直接対処するため、チームはフレームワークのボイラープレートに悩まされる時間を減らし、エンドポイント設計に集中できます。
型ヒントがコードを契約のようにする
FastAPIはPythonの型ヒントを重視します。フィールドをint、オプション、あるいはlist[Item]のように宣言すると、FastAPIはその情報を使って入力を検証し、出力を整えます。
これにより、IDを文字列として扱ったり数値として扱ったりするようなミスが減り、一貫したエンドポイント挙動が促されます。依然としてPythonですが、関数シグネチャに明確な期待が組み込まれます。
自動ドキュメントがチームの速度を上げる
APIのスキーマがコードから派生するため、FastAPIは対話型のドキュメント(OpenAPI + Swagger UI/ReDoc)を自動で生成できます。これは協業において重要です:フロントエンド開発者、QA、統合担当者がエンドポイントを試し、正確なモデルを待たずに確認できます。
人気だが万能ではない
FastAPIがあっても設計の悪いAPIが良くなるわけではありません。適切な命名、バージョニング、エラーハンドリング、セキュリティ設計は依然必要です。FastAPIは「アイデア」から「定義されたAPI」への道筋をより確実にし、驚きの少ない開発を助けます。
必要なキーコンセプト
FastAPIは、いくつかのコアアイデアを理解すれば扱いやすく感じられます。内部の詳細を暗記する必要はなく、日常的に使う要素を把握しておけば十分です。
FastAPIはフレームワークである
フレームワークとは、ゼロから始めずにAPIを構築するためのツールと規約のセットです。FastAPIは、エンドポイント定義、入力の読み取り、出力の返却、エラー処理、コードの整理など、一般的なAPIタスクの「配線」を提供します。
ルーティング:エンドポイントの定義方法
ルーティングは、URLとHTTPメソッドをPythonの処理に結びつける仕組みです。
例えば、GET /usersを「ユーザー一覧」に、POST /usersを「ユーザー作成」に割り当てます。FastAPIでは通常、@app.get(...)や@app.post(...)のようなデコレータでルートを定義し、APIが何を提供するかを一目でわかるようにします。
リクエストとレスポンス
すべてのAPI呼び出しはリクエスト(クライアントが送るもの)とレスポンス(サーバーが返すもの)で成り立っています。
FastAPIは次を助けます:
- パス(
/users/{id})、クエリ文字列(?page=2)、ヘッダー、リクエストボディからデータを読み取る - 適切なステータスコード(
200,201,404など)で構造化されたJSONレスポンスを返す
ASGI(高レベル)
FastAPIはASGIというモダンなPythonウェブサーバー標準上で動作します。実務上は、FastAPIが多くの接続を効率的に扱えるよう設計されており、WebSocketのような長時間接続もサポートできる、ということを意味します。
型ヒント:単なる「見た目」以上のもの
Pythonの型ヒント(str, int, list[Item]など)は、FastAPIでは単なるドキュメントではなく重要な入力情報です。FastAPIはそれらを使って期待するデータを理解し、受信値を正しい型に変換し、より予測可能なAPIを作ります。
Pydanticモデルによるバリデーション
Pydanticモデルはデータの形(フィールド、型、オプション)を一箇所で定義する手段です。FastAPIはこれらのモデルを使って受信JSONを検証し、無効な入力を親切なエラーメッセージで拒否し、出力も一貫してシリアライズします。これにより、クライアントが不正なデータを送ってきてもAPIが安定して動作します。
FastAPIのリクエストとレスポンスの扱い方
FastAPIアプリはエンドポイント(URLパス+HTTPメソッド)を中心に構成されます。エンドポイントは「クライアントが何を要求するか」と「どのように要求するか」を表します。例:クライアントはGET /usersでユーザー一覧を取り、POST /usersで作成します。
エンドポイント = パス + メソッド
パスはルート、メソッドはアクションです:
GET /products→ データ取得POST /products→ 作成用データを送信PUT /products/123→ 何かを置換/更新DELETE /products/123→ 削除
パスパラメータ vs クエリパラメータ
FastAPIはURLの一部であるデータとオプションのフィルタを分けて扱います。
- パスパラメータ:URL構造に含まれる。例:
GET /users/42→42がユーザーID - クエリパラメータ:
?以降に付くオプション。例:GET /users?limit=10&active=true→limitやactiveが結果の制御に使われる
JSONペイロードのためのリクエストボディ
クライアントが構造化データ(通常はJSON)を送るとき、それはリクエストボディに入ります。多くの場合POSTやPUTで使います。
例:POST /ordersに { "item_id": 3, "quantity": 2 } のようなJSONを送る。
レスポンスモデルと一貫した出力
FastAPIは単純なPythonオブジェクト(辞書など)を返すこともできますが、レスポンスモデルを定義すると威力を発揮します。モデルは契約のように振る舞い、フィールドを常に整形し、不要な内部フィールドを除外し、型を保証します。その結果、クライアントは期待するレスポンスを把握しやすくなり、統合時のトラブルが減ります。
FastAPIにおけるAsync:何で、いつ役立つか
「Async(非同期)」は、多くの時間を待ちに費やすときにAPIが多数のリクエストを効率よく捌けるようにする方法です。
日常的な例:I/O待ちを想像する
バリスタが注文をとる状況を想像してください。エスプレッソマシンが動いている間ずっと立ち止まって待っていたら、対応できる客数は少なくなります。より良い方法は、コーヒーを抽出している間に次の注文を受けることです。
Asyncはそれと同じ考え方です。FastAPIアプリはネットワーク待ちやデータベース呼び出しのような遅い処理を開始し、その待ち時間の間に他のリクエストを処理できます。
Asyncが最も役立つ場面
AsyncはI/O(待ち時間が多い処理)を多く含むAPIで特に有効です。例:
- データベース呼び出し(特にネットワーク越し)
- 外部サービス(決済、地図、メールAPIなど)へのリクエスト
- ファイル読み書きやオブジェクトストレージへのアクセス
こうした処理が多い場合、asyncはスループットを改善し、負荷時にリクエストが滞留する可能性を減らします。
Asyncがあまり意味を持たないとき
Asyncはすべてを高速化する魔法ではありません。エンドポイントが主にCPU負荷の高い処理(大きな画像のリサイズ、重いデータ処理、暗号化など)を行う場合、asyncはその計算自体を速めません。その場合は、バックグラウンドワーカー、プロセスプール、スケールアウトなど別の対策が必要です。
朗報:同期コードも動く
すべてを書き直す必要はありません。通常の同期defルート関数もFastAPIでそのまま動作します。多くのプロジェクトではシンプルなエンドポイントは同期のままにし、データベース呼び出しなどでasync defを使うことが一般的です。
Pydanticによるデータバリデーションとシリアライズ
バリデーションは外部から来たデータとあなたのコードの間にあるチェックポイントです。APIが入力(JSONボディ、クエリパラメータ、パスパラメータ)を受け取るとき、データが完全で正しい型で合理的な範囲内であることを確認したいはずです。これを行わずにDBに書き込んだり他サービスを呼び出すと問題が起きます。
FastAPIはPydanticモデルに依存しています。良いデータの形を一度だけ記述すると、FastAPIは自動で:
- 不正な入力を早期に拒否する
- 可能なら型を変換する(例:
"42"→整数) - 一貫したJSONレスポンスを返す(シリアライズ)
不正入力を早期に検出(わかりやすいエラー)
クライアントが間違った形のデータを送ると、FastAPIは422 Unprocessable Entityと、どのフィールドにどんな問題があるかを指す構造化されたエラーを返します。これによりクライアント開発者は素早く不具合を直せます。
よくあるバリデーション例
小さなモデルで必須フィールド、型、最小/最大制約、フォーマットを示します:
from pydantic import BaseModel, EmailStr, Field
class UserCreate(BaseModel):
email: EmailStr
age: int = Field(ge=13, le=120)
username: str = Field(min_length=3, max_length=20)
- 必須フィールド:
emailは必須 - 型:
ageは整数である必要がある - 最小/最大:
ageは13〜120の範囲 - フォーマット:
EmailStrは有効なメール形式を要求
シリアライズ:クリーンで予測可能なJSONを返す
同じモデルを出力に使えば、APIレスポンスが内部フィールドを漏らさず整った形で返されます。Pythonオブジェクトを返すと、FastAPI(Pydantic経由)が正しいフィールド名と型のJSONに変換します。
自動APIドキュメント:OpenAPI、Swagger UI、ReDoc
FastAPIの実用的な特徴の一つは、書いたコードに基づいてAPIドキュメントを自動生成してくれることです。
OpenAPI:機械可読なAPI契約
OpenAPIはAPIを構造化フォーマット(通常JSON)で記述する標準です。以下を明確にします:
- どのエンドポイントがあるか(例:
GET /users/{id}) - どんなパラメータを受け取るか
- リクエストボディの形
- 期待されるレスポンスやエラー形式
機械可読なので、ツールはこれを使ってクライアント生成、リクエスト検証、チーム間の整合などを自動化できます。
Swagger UIとReDoc:そのまま使える対話型ドキュメント
FastAPIは2つの人間向けドキュメントページを自動で提供します:
- Swagger UI(インタラクティブ):ブラウザ上でエンドポイントを試し、パラメータを入力してリクエストを送れる
- ReDoc(リファレンス向け):読みやすいリファレンススタイルのドキュメント
通常、次のURLで利用できます:
/docs(Swagger UI)/redoc(ReDoc)
コードと同期するドキュメント
パスパラメータ、リクエストモデル、レスポンスモデル、バリデーションルールを変更すると、OpenAPIスキーマ(とドキュメントページ)は自動で更新されます。別途ドキュメントをメンテする手間が減ります。
フロントエンドやQAが早く動ける理由
- フロントエンドはエンドポイントをすぐに試せ、必須フィールドを待たずに把握できる
- QAは欠損フィールドや型違いなどのエッジケースを簡単に試せる
- 実行中のAPIとそのOpenAPI契約が共通の事実源になる
はじめてのFastAPIアプリ(概念的ウォークスルー)
FastAPIアプリは小さくても「本物」の感触があります。Pythonオブジェクトappを定義し、いくつかのルートを追加し、ローカルサーバーでブラウザから試せます。
1) 最小の "hello" エンドポイント
最小の実用例はこちら:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"message": "Hello, FastAPI"}
これだけで、GET /がJSONを返す一つのルートができます。
2) 簡単な作成/一覧エンドポイント(メモリ内)を追加
学習用として、リストにアイテムを保存する例です。これはDBではなく、サーバー再起動でデータは消えますが学習には十分です。
from fastapi import FastAPI
app = FastAPI()
items = []
@app.post("/items")
def create_item(name: str):
item = {"id": len(items) + 1, "name": name}
items.append(item)
return item
@app.get("/items")
def list_items():
return items
POST /items?name=Coffeeでアイテムを追加GET /itemsでリストを取得
3) 典型的な小さなプロジェクト構成
一般的なスターター構成:
main.py(appとルートを作成)requirements.txtまたはpyproject.toml(依存関係)
4) ローカルでの実行(概念)
通常の流れ:
- 依存関係をインストール(FastAPI + ASGIサーバーとしてUvicornなど)
- 開発サーバーを起動(例:
uvicorn main:app --reload) http://127.0.0.1:8000を開いてエンドポイントを試す
依存関係(Dependencies)と再利用できる部品
FastAPIの「依存関係」は、エンドポイントが必要とする共通の入力(DBセッション、現在のログインユーザー、アプリ設定、共通クエリパラメータなど)を表します。これらを各ルートで手動で生成/解析する代わりに一度定義しておけば、FastAPIが必要な場所へ提供してくれます。
依存関係とは(平たく言うと)
依存関係は通常、値を返す関数(またはクラス)です。FastAPIはその関数を呼び出し、必要なパラメータを見て結果をエンドポイントに注入します。
依存性注入と呼ばれますが、「必要なものを宣言すればFastAPIが配線してくれる」と考えるとわかりやすいです。
なぜ重複が減るのか
依存関係がなければ、各エンドポイントで:
- DB接続のオープン/クローズを繰り返す
- 認証チェックを到る所で重複させる
- 同じページネーションパースを複数箇所に書く
といったことが起きます。依存関係を使えばロジックを一箇所にまとめられ、後でDBセッションの作り方やユーザーロード方法を変更する際も一箇所直せば済みます。
よくある依存関係の例
- DBセッション:リクエストごとにセッションを作成して確実に閉じる
- 設定/コンフィグ:環境に基づく設定を提供
- ページネーション:
page/limitの解析と検証を再利用 - 認証ユーザー:トークンから現在のユーザーを取得して権限を強制する
依存関係をエンドポイントに組み込む方法
よく見るパターンの概念例:
from fastapi import Depends, FastAPI
app = FastAPI()
def get_settings():
return {"items_per_page": 20}
@app.get("/items")
def list_items(settings=Depends(get_settings)):
return {"limit": settings["items_per_page"]}
Depends(...)で依存関係を宣言すると、FastAPIがその結果をエンドポイントのパラメータとして渡します。get_db()やget_current_user()のような複雑な部品にも同じ方法が使え、アプリが成長してもコードが綺麗に保てます。
セキュリティの基礎:認証と認可
FastAPIはAPIを自動的に保護するわけではありません。方式を選び、依存関係などでエンドポイントに組み込む必要があります。良い点は、FastAPIが依存関係システムを通じて一般的なセキュリティパターンを簡単に実装できるビルディングブロックを提供していることです。
認証と認可の違い
**認証(Authentication)**は「あなたは誰か?」に答え、**認可(Authorization)**は「何ができるか?」に答えます。
例:ユーザーは認証されていても、管理者専用ルートへのアクセスは認可されないかもしれません。
よくある認証方式(概要)
- APIキー:サービス間アクセスにシンプル。通常はヘッダー(例:
X-API-Key)で送る。ローテーションや取り消しを管理すること。 - OAuth2:委譲アクセスの標準。よくある「~でサインイン」や認証を分離する用途で使う。
- JWT(JSON Web Token):ベアラートークンとして使われることが多い。ステートレスなAPIに便利だが、有効期限、署名鍵、取り消し戦略を設計する必要がある。
FastAPIはfastapi.securityのようなユーティリティを提供し、OpenAPIにもこれらをドキュメント化できます。
パスワード取り扱いの基本
ユーザーパスワードを保存する場合、平文で保存してはいけません。ソルト付きの遅いハッシュ(bcryptやargon2などの既存ライブラリ)を使いましょう。さらにレート制限やアカウントロックアウト方針も検討してください。
注意点
セキュリティは細部の問題です:トークンの保存、CORS設定、HTTPS、シークレット管理、機微なエンドポイントでの正しい認可チェックなど。組み込みのヘルパーは出発点として使い、運用前にレビューとテストで設計を検証してください。
FastAPIアプリのテスト
テストは「自分のマシンでは動く」から「安心して公開できる」へ変える工程です。良い知らせは:FastAPIはStarlette上に構築されているため、強力なテストツールがほとんど追加設定なしで使えることです。
単体テスト vs 統合テスト
単体テストは小さな部品(値を計算する関数、現在のユーザーを読み込む依存関係、DBを呼ぶサービスメソッドなど)に焦点を当てます(外部はモックすることが多い)。
統合テストはAPIをエンドツーエンドで検証します:エンドポイントを呼び出してHTTPレスポンスを検証することで、ルーティングや依存関係の配線、バリデーションの問題を発見できます。
健全なテストスイートは、速い単体テストを多く、信頼度の高い統合テストを少なめに持つことが多いです。
TestClientの考え方
FastAPIアプリはStarletteのTestClientを使ってプロセス内でテストできます。サーバーを起動する必要はありません。
from fastapi.testclient import TestClient
from app.main import app
client = TestClient(app)
def test_healthcheck():
r = client.get("/health")
assert r.status_code == 200
テストすべき項目(実践チェックリスト)
- ステータスコード(200、201、404、422など)
- バリデーションエラー(必須フィールド欠如、型不一致、余分なフィールド)
- レスポンス形状(キーの有無、型、空リストの扱い)
- エッジケース(0件、巨大入力、境界日付)
- 認証ケース(トークンなし、期限切れ、権限不足)
テストを速く再現可能に保つ
予測できるデータを使い、外部サービスはモックするかテスト用DBを使い、テスト間で状態を共有しないようにします。速いテストは実行され、遅いテストは省かれがちです。
FastAPIのデプロイ:実践的選択肢とチェックリスト
FastAPIアプリを公開するには、適切なランナーを選び、本番向けにいくつかの必須要素を追加するだけです。
開発サーバーと本番サーバーの違い
ローカルでuvicorn main:app --reloadを使うと開発用の設定(自動リロードや詳細なエラー表示など)で動きます。本番では通常、Uvicornを--reloadなしで動かし、プロセスマネージャ(Gunicorn+Uvicornワーカー等)やリバースプロキシの背後で運用します。目的は安定性:再起動の管理、予測可能なパフォーマンス、安全なデフォルト設定です。
環境変数での設定
一般的なパターン:
- シークレットや環境依存の値(DB URL、APIキー、許可するオリジンなど)を環境変数に保存する
- ローカル用にコード内で妥当なデフォルトを用意する
- 起動時に設定を読み込み検証する(Pydantic Settingsを使うことが多い)
これにより1つのコードベースを複数環境にデプロイできます。
よく使われるデプロイ先(概要)
- コンテナ(Docker/Kubernetes):再現性のあるビルドとスケーリングに便利
- 仮想マシン:自分でサーバー管理する場合に柔軟
- サーバーレス:小規模APIには向くが、コールドスタートやプラットフォームの制限に注意
実用的なデプロイチェックリスト
本番と呼ぶ前に確認する項目:
- ログ:構造化ログ、リクエストID(必要なら)、環境ごとのログレベル
- ヘルスチェック:
/healthのような監視用エンドポイント - エラーハンドリング:一貫したJSONエラー応答。スタックトレースはユーザーに表示しない
- タイムアウトと制限:リクエストボディサイズ、ワーカータイムアウト、レート制限
- ドキュメント方針:Swagger UI/ReDocを公開するか制限するかの判断
ローカルから本番へ移すときは、OpenAPI出力をCIで使ってクライアント生成やリクエスト検証を行うなど、API契約を標準化すると良いです。例えば、Koder.aiのようなツールを使えばチャットでAPIを設計し、エンドポイントやモデルのスキャフォールドを素早く生成して標準的なレビュー・デプロイパイプラインへ繋げることもできます。
FastAPIを使うべき時(と使わない方が良い時)
FastAPIは、PythonでクリーンでモダンなREST APIを構築したいときに強力な選択肢です。特にリクエスト/レスポンスモデルの明確さや、APIが成長したときの予測可能性を重視する場合に適しています。
適したユースケース
- 内部サービス:チーム内で素早く反復し、読みやすいエンドポイントと共有契約が重要な場合
- 公開API:厳格な入力検証と一貫したエラーハンドリングが求められる場合
- マイクロサービス:小さく集中したAPIを個別にデプロイする場合
- プロトタイプやMVP:素早く進めたいが構造(バリデーション+ドキュメント)は保持したい場合
別のツールが向く場合
FastAPIが常に最短の選択とは限りません:
- ワンオフスクリプトや小さなWebhookハンドラなら、より軽い手段や単純なPythonスクリプトで十分なこともあります。
- Djangoの“電池付き”スタック(ORM、管理画面、テンプレート、成熟したエコシステム)が必要な場合は、DjangoやDjango REST Frameworkの方が意思決定や結合コードを減らすことがあります。
パフォーマンスに関する現実的な言葉
FastAPIは実運用で非常に高速になり得ますが、速度はDB呼び出し、ネットワーク待ち、ビジネスロジック次第です。フレームワークだけで「遅いI/O」や「非効率なクエリ」を解決するわけではないことに注意してください。
次のステップ
FastAPIが合いそうなら、ルーティングパターン、Pydanticモデル、データベース統合、バックグラウンドタスク、基本的な認証から始めてください。実践的な進め方は小さなエンドポイントセットを作り、再利用可能な依存関係とテストを追加しながら拡張することです。初期のスキャフォールド(ルート、モデル、デプロイ準備構造)を素早く作りたい場合は、チャットで仕様を詰めてコードを生成するワークフロー(vibe-coding)を使うのも有効です。Koder.aiのようなツールはこの段階で役立ちます:チャットでAPIをプロトタイプし、生成されたコードをレビューして標準的なプロジェクトとして出力できます。
よくある質問
FastAPIを簡単に説明すると何ですか?
FastAPIは、ボイラープレートを最小限に抑えてAPIを構築できるPythonのウェブフレームワークです。エンドポイント関数(例:@app.get("/users"))を書くと、FastAPIがルーティング、リクエスト解析、バリデーション、JSONレスポンスなどを処理します。
大きな利点は、型ヒントやPydanticモデルがAPIが受け取るものと返すものの明確な契約として機能する点です。
APIとは何で、FastAPIとはどう関係しますか?
APIは、他のソフトウェアがデータをやり取りするために呼び出すURL(エンドポイント)の集合です。
例えば、クライアントがGET /weather?city=Berlinを要求すると、サーバーは構造化されたJSONで応答します。クライアントはサーバーのデータベースに直接アクセスする必要はなく、APIの応答を使って表示を行います。
FastAPIでルートとHTTPメソッドはどう機能しますか?
ルーティングはHTTPメソッドとパスをPython関数に結びつけます。
FastAPIでは通常、デコレータを使います:
@app.get("/items")は読み取り操作向け@app.post("/items")は作成操作向け@app.put("/items/{id}")は更新/置換向け@app.delete("/items/{id}")は削除向け
このようにコードからAPIの表面(どんなエンドポイントがあるか)を一目で把握できます。
パスパラメータとクエリパラメータの違いは何ですか?
パスパラメータはURLの一部で、特定のリソースを識別するために使われ、通常は必須です。
- パス例:
GET /users/42→42はパスパラメータです。
クエリパラメータは?の後に付加されるもので、通常はオプションのフィルタや制御に使われます。
- クエリ例:
GET /users?limit=10&active=true→limitやactiveがクエリパラメータです。
FastAPIはPydanticでどのようにデータを検証しますか?
Pydanticモデルはデータの形(フィールド、型、オプション)を定義します。FastAPIはこれを用いて:
- 受信リクエストを検証する
- 可能な場合は型を変換する(例:
"42"→整数) - 一貫したJSONレスポンスを返す
バリデーションに失敗すると、FastAPIは通常422 Unprocessable Entityで、どのフィールドが間違っているかを示す詳細なエラーを返します。
FastAPIはどのように自動APIドキュメントを生成しますか?
FastAPIはエンドポイントや型ヒント、モデルからOpenAPIスキーマを自動生成します。
通常、次のようなインタラクティブなドキュメントが自動で利用できます:
/docs(Swagger UI)/redoc(ReDoc)
コードからスキーマが派生するため、パラメータやモデルを変更するとドキュメントも自動的に更新されます。
FastAPIでいつasyncエンドポイントを使うべきですか?
async defはI/O待ちが多い処理(データベース呼び出し、外部HTTPリクエスト、ファイルやオブジェクトストレージへの入出力)で有効です。
次の場合は通常def(同期関数)で問題ありません:
- 単純で同期的なコード
- 使用するライブラリがasyncをサポートしていない場合
- 主にCPUバウンドな処理(画像リサイズや重い計算など)
同じアプリ内で同期と非同期を混在させるのはよくあるパターンです。
FastAPIの依存性とは何で、なぜ便利ですか?
依存性(Dependencies)は、Depends()を通じてエンドポイントに注入される再利用可能な『部品』です。
よくある用途:
- リクエストごとのDBセッション
- 認証:現在のユーザーを読み込む、権限チェックを行う
- 共通のクエリ解析(ページネーション、フィルタ)
- アプリ設定/コンフィグ
重複を減らし、横断的なロジックを一箇所に集中させることで、変更があっても1箇所を直せば済みます。
FastAPIでAPIを作るときに知っておくべきセキュリティの基本は?
FastAPI自体は自動でセキュリティを提供しないので、方式を選んで各エンドポイントに適用します。
一般的なパターン:
- APIキー(ヘッダー経由など)
- OAuth2フロー
- ベアラートークン(JWTなど)
注意点:
- パスワードは平文で保存してはいけません。ソルト付きの遅いハッシュ(bcryptやargon2など)を用いること。
- 認証(誰か)と認可(何ができるか)を分けて考えること。
- HTTPS、CORS設定、シークレット管理などの詳細に注意すること。
FastAPIアプリは現場でどうテスト・デプロイしますか?
テストにはStarletteのTestClientを使ってアプリに対してプロセス内リクエストを行う方法が便利です(サーバーを立てる必要がありません)。
アサーションの例:
- ステータスコード(200/201/404/422)
- バリデーション挙動(必須フィールドの欠如、型の不一致)
- レスポンスの形(キーの有無、型)
- 認証シナリオ(トークンなし、期限切れ、権限不足)
デプロイ時はASGIサーバー(Uvicorn等)で稼働させ、ログ、ヘルスチェック、タイムアウト、環境変数による設定などの本番向けチェックを追加します。