FastAPI
型ヒントからAPI仕様と検証を自動生成する、Pythonの非同期Webフレームワーク
分野「サーバー・API」:画面の裏側で、頼まれた処理をしてデータを返す係。 分野の役割とつながりは分野の解説へ。
別名:fastapi、Fast API、FastAPI (Python)
できること
- HTTP API を公開する :自分のデータや処理を他から呼ばせたい
- 常時起動のプロセスを保持する :WebSocket や常駐ワーカーを動かしたい
FastAPI ができないこと
- HTTPS の終端(TLS 証明書の処理は Nginx・Caddy・Traefik 等のプロキシに任せる前提)
- 実行基盤の提供(サーバー・コンテナ・関数基盤は別に用意し、そこで ASGI サーバーを動かす)
- 複数プロセス・複数サーバーにまたがる重いバックグラウンド処理(BackgroundTasks は同一プロセス内。Celery 等のジョブキューが別途必要)
- Python 3.9 以前の環境での動作
- ブラウザ側の画面構築(テンプレート描画はできるが、コンポーネント指向の UI は React 等の領分)
制約
先頭の行が、このツールで最も先に当たる制約。値はすべて出典の一次情報で確認したもの。
| 項目 | 値 | 影響 | 出典 | 検証日 |
|---|---|---|---|---|
| 対応 Python バージョン (主要制約) | Python 3.10 以上(3.10〜3.14 を公式サポート) | OS 同梱の古い Python や、3.9 で止まっているサーバーでは動かない。実行環境の Python を先に確認する | github.com | |
| 同期関数と非同期関数の実行方式 | def で書いた処理は外部スレッドプールで実行、async def はイベントループ上で直接実行される(依存関係の関数も同じ) | async def の中でブロッキング I/O(同期 DB ドライバ、requests 等)を呼ぶとイベントループが止まり、全リクエストが待たされる。同期ライブラリを使う処理は def で書く | fastapi.tiangolo.com | |
| バージョン互換性の方針 | 0.x 系。MINOR バージョンで破壊的変更と新機能が入り、PATCH のみが非破壊 | 「fastapi>=0.112.0,<0.113.0」のように MINOR を固定しないと、依存更新で API が壊れる | fastapi.tiangolo.com | |
| 既定のプロセス数 | 1 プロセス(fastapi run / uvicorn の既定)。--workers N で複製してマルチコアを使う | 1 プロセスでは CPU コアを1つしか使えない。ワーカーを増やすとプロセス内メモリの状態(キャッシュ・接続)は共有されなくなる | fastapi.tiangolo.com | |
| HTTPS の扱い | アプリケーションサーバー(Uvicorn)は HTTPS を処理せず、TLS 終端プロキシと平文 HTTP で通信する構成が公式の前提 | 公開時はプロキシ(Traefik、Caddy、Nginx、HAProxy)か、HTTPS を提供するホスティング基盤が別途必要になる | fastapi.tiangolo.com | |
| ファイルアップロードの前提 | python-multipart の追加インストールが必要。File / Form パラメータと JSON の Body は同一エンドポイントで併用できない(HTTP の仕様上、1リクエストの本文は1形式) | ファイルとメタデータを同時に受けるなら、メタデータも Form フィールドにするか、エンドポイントを分ける | fastapi.tiangolo.com |
典型的な落とし穴
- async def のエンドポイントで同期の DB ドライバや requests を呼び、負荷をかけたときだけ全体が遅くなる
- Starlette と Pydantic のバージョンに挙動が引きずられる。FastAPI だけでなく依存ごとロックファイルで固定する
- 自動生成される /docs と /openapi.json を本番でも公開したままにし、内部 API の構造が外部から見える
- --workers でプロセスを増やした後、プロセス内変数に置いたキャッシュや WebSocket 接続の一覧がワーカー間で食い違う
コスト
- 課金モデル
- 無料
- 跳ねる条件
MIT ライセンスで無償。費用は動かすサーバー・コンテナ・関数基盤の側で発生する
- 出典
- github.com 検証
代替手段と差分
| 代替 | 何が違うか |
|---|---|
| Hono | Hono は TypeScript で Web 標準 API のみを使い、Cloudflare Workers 等のエッジでも同じコードが動く。FastAPI は Python のデータ処理・AI ライブラリと同居でき、型ヒントから検証と OpenAPI を自動生成する |
| Go | Go は標準ライブラリだけで HTTP サーバーを書け、単一バイナリで配布でき、並列処理が言語機能として軽い。FastAPI は書く量が少なく Python 資産を直接使えるが、CPU 負荷の高い処理と配布の軽さでは Go が勝る |
このツールを代替として挙げているページ: Hono
選定判断
Python でデータ処理や AI 推論を HTTP API として公開する用途では第一候補。CPU 負荷の高い処理を1プロセスで並列に捌く必要がある場合、エッジ配置や単一バイナリ配布が要る場合は避け、Go か Hono へ
Starlette(Web 部分)と Pydantic(データ検証)の上に作られたフレームワークで、関数の型ヒントを書くだけで入力検証・シリアライズ・OpenAPI 仕様・対話型ドキュメントが揃う。Python 側にある pandas・PyTorch・各種 AI SDK をそのまま API 化できる点が、他言語のフレームワークに対する実質的な差である。
利用者が最初に当たるのは Python のバージョン要件(3.10 以上)で、次に当たるのが async def と def の使い分けである。async def の中に同期のブロッキング処理を書いても開発中は動くため、負荷がかかった本番で初めてイベントループの停止として現れる。