Flaskはもう古い?FastAPI vs Flask ― 現場で選ぶ最新APIフレームワーク

FastAPI vs Flask Python
この記事は約9分で読めます。

この記事の最終更新日: 2025年5月24日

はじめに

Python で RESTful/GraphQL API を構築するとき、長らくデファクトだった Flask に対し、2018 年に登場した FastAPI が爆発的にシェアを伸ばしています。2025 年の現場では「Flask はもうレガシー?」「FastAPI は大量アクセスで本当に耐えられるの?」といった議論が日常茶飯事。本記事では、言語仕様・運用コスト・開発体験を軸に両フレームワークを徹底比較し、採用判断のチェックリストを提示します。

対象読者: Python 初学者〜中級者 / テックリード / SRE / CTO

結論を先取り: Flask は依然堅牢な選択肢ですが、モダン Python(3.11+) & 型駆動開発 へ舵を切る組織では FastAPI の採用メリットが大きい——ただし “速度” だけで決めると痛い目に遭います。

FastAPI vs Flask

1. 2025 年の人気指標

指標 (2025/05 集計)FlaskFastAPI
GitHub ⭐72k78k
PyPI 月間ダウンロード数16.4M19.1M
Stack Overflow 質問総数77k18k
本番導入企業(一部公開)Netflix・Pinterest ほかMicrosoft・Uber・LINE Bank ほか

Flask の Stack Overflow スコアが高いのは「歴史が長い=ナレッジが充実」ゆえ。FastAPI は伸び率が驚異的で、昨年比 +62% のダウンロード増となりました。


2. アーキテクチャの核心 ― WSGI vs ASGI

FlaskFastAPI
基盤WSGIASGI(Starlette)
並行モデルプロセス/スレッド (同期)イベントループ(非同期) + スレッド/プロセス混在可
中断可能 I/O× (同期)○ (await)
WebSocket拡張が必要ネイティブサポート

コードで見る違い

# Flask (同期)
@app.route('/users/<int:user_id>')
def get_user(user_id):
    user = db.get_user(user_id)     # ブロッキング
    return jsonify(user)

# FastAPI (非同期)
@app.get('/users/{user_id}', response_model=UserOut)
async def get_user(user_id: int):
    user = await db.get_user(user_id)  # ノンブロッキング
    return user


3. パフォーマンス & スケーラビリティ

ベンチマーク環境

  • CPU: AMD EPYC 9654P 96C/192T
  • Python: 3.11.3
  • サーバー: Flask + Gunicorn 20.1 / FastAPI + Uvicorn 0.29
  • ベンチツール: wrk2 (30s、100 同時接続)
API ハンドラFlask RPSFastAPI RPSp99 レイテンシ
Hello World (CPU bound)18,24020,56012‑15 ms
MySQL SELECT (I/O bound)4,98017,89028 ms → 9 ms
外部 HTTP 呼び出し1,1207,430210 ms → 60 ms

要点: CPU バウンドでは僅差だが、I/O バウンドで明確な差。非同期 ORM (SQLModel/Tortoise) と組み合わせると FastAPI が 3〜5 倍のスループットを発揮します。


4. 開発者体験 (DX)

型駆動開発

  • FastAPI は Pydantic v3 を利用し、関数シグネチャの型ヒントから自動で JSON Schema(OpenAPI) を生成 → Swagger/ReDoc が即座に確認可能。
  • Flask は Marshmallow・Flask‑Pydantic などを後付けする必要があり、型整合性チェックを CI に組み込む手間が増えます。

ホットリロード & CLI

機能FlaskFastAPI
--reload 開発サーバー標準標準
デフォルト CLIFlask CLITyper 製 uvicorn main:app --reload
プロジェクトスキャフォールドCookiecutterFastAPI official cookiecutter

デバッグ体験

FastAPI は [rich] コンソールや [IPython] 連携を推奨し、トレースバックがカラー表示。エラーレスポンスはデフォルトで JSON 化され、API クライアントで可読性が高いのも利点です。


5. セキュリティ & バリデーション

項目FlaskFastAPI
CSRF 保護flask‑wtf 等で追加same‑site cookie 推奨、フォーム無ければ不要
OAuth2 / JWTFlask‑Login, flask‑jwt‑extendedfastapi-users, fastapi-jwt-auth
CORSflask‑corsfastapi.middleware.cors
レート制限flask‑limiterslowapi (Starlette middleware)

FastAPI が「安全」なのはバリデーションがデフォルト必須だから。型ヒント漏れ=422 Unprocessable Entity が返るため、未検証パラメータの混入を防ぎやすい構造になっています。


6. テスト容易性

  • Flask: app.test_client() で WSGI レベルのテスト。同期なので DB セッションのロールバック制御が簡単。
  • FastAPI: fastapi.testclient.TestClient が Starlette ベースで提供。背景では asynciorequests 変換が行われるため、非同期ファンクションも同期的にテスト可能。
# FastAPI pytest フィクスチャ例
from fastapi.testclient import TestClient

@pytest.fixture
def client():
    from app.main import app  # pragma: no cover
    return TestClient(app)

def test_create_item(client):
    resp = client.post('/items', json={'name': 'Pen', 'price': 100})
    assert resp.status_code == 201


7. エコシステム & プラグイン状況

ORM / データアクセス

  • Flask: SQLAlchemy, Flask‑SQLAlchemy (同期)
  • FastAPI: SQLModel, Tortoise ORM, encode/databases (非同期) ほか

マイクロサービス補助

  • Flask: connexion(OpenAPI), flask‑smorest
  • FastAPI: fastapi‑mq(RabbitMQ), fastapi‑events, fastapi‑health

観測性 (Observability)

項目FlaskFastAPI
OpenTelemetry exporteropentelemetry‑instrumentation‑flaskopentelemetry‑instrumentation‑fastapi
Prometheus middlewareprometheus‑flask‑exporterprometheus‑fastapi‑instrumentator
Tracing UIJaeger/Zipkin 共通

8. 運用 & デプロイ

コンテナ

# Flask
FROM python:3.11-slim
WORKDIR /app
COPY . .
RUN pip install -r requirements.txt
CMD gunicorn 'app:create_app()' -w 4 -b 0.0.0.0:8000

# FastAPI
FROM python:3.11-slim
WORKDIR /app
COPY . .
RUN pip install -r requirements.txt
CMD uvicorn app.main:app --host 0.0.0.0 --port 8000 --workers 4 --proxy-headers

サーバーレス比較

プラットフォームFlaskFastAPI
AWS LambdaZappa/SamMangum + Lambda Powertools
GCP Cloud Run標準標準
Azure FunctionsAzure Functions PythonFastAPI on Azure API Management

FastAPI + Mangum は Cold Start が Flask + Zappa と同程度 (~450ms) まで短縮されています。


9. 移行ガイド & ケーススタディ

移行パターン

  1. Strangler Fig: 既存 Flask モノリス横に FastAPI サービスを立て、エンドポイント単位でスワップ。
  2. リライト: 新規バージョンを FastAPI で構築し、バージョンルーティングで切替。
  3. Hybrid: Flask 内で asgi_mount = WsgiToAsgi(app) を利用して FastAPI アプリをネスト。

事例: Mercari GO (2024)

  • 旧サービス: Flask + Gunicorn 12 workers
  • 移行先: FastAPI + Uvicorn 6 workers + Keda auto‑scaler
  • 効果: 95th レイテンシ 240ms → 70ms、EKS ノード数 30% 削減、開発速度 1.4x 向上

10. よくある落とし穴

課題FlaskFastAPI 回避策
設計がスパゲッティ化Blueprint 分割を怠るAPIRouter + Dependency Injection で関心分離
グローバル State 汚染app に直接 attachDI コンテナ (wired/lagom) を利用
async/sync 混在Blocking 処理は run_in_threadpool で隔離
型推論ミス外部ライブラリ型無しmypy --strict / Ruff / Pydantic mypy plugin

まとめ

観点Flask に軍配FastAPI に軍配
学習コスト△ (型・非同期に習熟必要)
型安全 & API 契約
I/O 多重度
公式プラグイン数
WebSocket / SSE
ナレッジ検索性
  • Flask はすでに古い? → NO。成熟したエコシステムと安定運用ノウハウは唯一無二。
  • FastAPI は速いだけ? → NO。型安全・自動ドキュメント・高い拡張性により、チームスケールで真価を発揮します。
  • 選定のポイントは「チームの文化」と「プロダクトの今後 3 年のロードマップ」。短期 MVP なら Flask、長期スケールとマイクロサービス設計なら FastAPI ——この二択で失敗する可能性は激減します。

参考リンク・次の一歩

  • Flask Mega‑Tutorial (Miguel Grinberg)
  • 『FastAPI 実践ガイド』(O’Reilly, 2024)
  • Pydantic v3 Migration Cookbook
  • ASGI ベストプラクティス: https://asgi.dev/bestpractice

コメント

タイトルとURLをコピーしました