導入:「どれが優れているか」は誤った問い
「Flask・FastAPI・Django、結局どれを選べばいいのか」——この問いに、唯一の正解はありません。三者は同じ「Python の Web フレームワーク」というカテゴリに括られますが、解こうとしている問題が違うからです。優劣ではなく、「あなたの要件に対して、どれが最小の負債で目的に届くか」 という適合の問題です。
本記事は、その適合を判断するための意思決定フレームワークです。私は、経済産業大臣賞を受賞した B2B SaaS のバックエンドを Flask / SQLAlchemy / PostgreSQL で設計・実装して本番運用し(木材流通DXの事例)、別案件では FastAPI で API サービスも構築してきました。つまりこの比較は、「両方を本番で動かした人間」の視点です。だからこそ、Flask を勧めるべきでない場面も、はっきり書きます。営業トークではなく、技術選定のための道具として読んでください。
💡 この記事で扱うバージョン(2026年6月時点):Flask 3.1 系(最新安定版 3.1.3、2026-02/最小 Python 3.9)、FastAPI 0.13x 系(2026年中盤で 0.138.x 付近、いまだ 1.0 未満/要 Python 3.10+)、Django 6.0 系(現行 LTS は 5.2 LTS、延長サポートは 2028年4月まで/次期 LTS は 6.2 LTS が 2027年4月予定)。フレームワークの API・推奨は各公式ドキュメント最新版に基づきます。
1. 結論を先に:30 秒の TL;DR と全体比較表
迷ったときの一行指針はこうです。
- REST/JSON API を、型安全に・高並行で作りたい → FastAPI
- 管理画面・認証・ORM 込みの「Web アプリ全体」を最短で立てたい → Django
- 構成を一つひとつ自分で選びたい/小〜中規模を薄く作りたい → Flask
この直感を、まず一枚の表で全体像にします。以降の各セクションは、この表の各行を掘り下げたものです。
| 観点 | Flask | FastAPI | Django |
|---|---|---|---|
| 思想 | マイクロ(核だけ・自分で組む) | API ファースト(型駆動) | バッテリー同梱(全部入り) |
| 基盤 | WSGI(Werkzeug + Jinja) | ASGI(Starlette + Pydantic) | 独自(WSGI/ASGI 両対応) |
| 同期/非同期 | 同期が基本(async は後付け) | 非同期ネイティブ(async def) | 同期が基本(async は部分対応) |
| 型検証 | 内蔵なし(marshmallow / Pydantic を足す) | Pydantic で型ヒント=検証 | Forms / DRF Serializer |
| 管理画面 | なし(自作 or Flask-Admin) | なし(自作) | 標準で自動生成 |
| ORM | なし(SQLAlchemy 等を足す) | なし(SQLAlchemy 等を足す) | Django ORM 同梱 |
| マイグレーション | なし(Flask-Migrate/Alembic) | なし(Alembic 等) | makemigrations 同梱 |
| 認証 | なし(Flask-Login 等) | なし(自作 / ライブラリ) | 認証・権限 同梱 |
| 自動 API ドキュメント | なし | OpenAPI + Swagger UI 自動 | DRF で別途 |
| 学習曲線 | 低い(核は小さい)/設計は要鍛錬 | 中(型・async の理解が要る) | 中〜高(規約が多い) |
| 代表用途 | 小〜中規模サービス・社内ツール・選定の自由が要る案件 | 高並行 API・マイクロサービス・型契約重視 | コンテンツ/CRUD 中心の Web アプリ全体 |
| 現行版(2026/06) | 3.1.3(安定) | 0.138.x(0.x 系) | 6.0/LTS は 5.2 |
⚠️ この表を「点数表」として読まないでください。「管理画面なし」は Flask/FastAPI の欠点ではなく設計判断です。要らない機能を持たないからこそ薄く速い。逆に管理画面が要件なら、それを「持っている」Django が一歩抜けます。比較の鍵は機能の多寡ではなく、あなたの要件との一致です。
2. Flask:最小核と、設計の自由(とその責任)
2.1 思想:何を載せるかをあなたが決める
Flask は WSGI マイクロフレームワークです。基盤は Werkzeug(WSGI/HTTP 層)と Jinja(テンプレート)で、Flask 自身が提供するのは「ルーティング・リクエスト/レスポンス・テンプレート・設定・コンテキスト」という核だけです。ORM もフォーム検証も管理画面も認証も内蔵しません。
公式が「micro」と呼ぶのは「機能が貧弱」という意味ではなく、「何を載せるかをあなたが決める」 という意味です。DB を使うなら Flask-SQLAlchemy、フォーム/CSRF なら Flask-WTF、マイグレーションなら Flask-Migrate、API の入出力検証なら marshmallow——必要なものだけを拡張として明示的に組み込みます。
2.2 含むもの / 含まないもの
| カテゴリ | Flask の扱い | 典型的な追加 |
|---|---|---|
| ルーティング・リクエスト | 内蔵 | — |
| テンプレート | 内蔵(Jinja) | — |
| ORM | なし | Flask-SQLAlchemy / SQLAlchemy |
| マイグレーション | なし | Flask-Migrate(Alembic ラッパ) |
| フォーム/CSRF | なし | Flask-WTF |
| 入出力バリデーション | なし | marshmallow / Pydantic |
| 管理画面 | なし | Flask-Admin(or 自作) |
| 認証 | なし | Flask-Login / Authlib |
最小形は文字通り数行です。
# hello.py — Flask の「核」だけが見える最小形
from flask import Flask
app = Flask(__name__)
@app.get("/health")
def health():
return {"status": "ok"}
2.3 async の話:後付けであり、スループットは上がらない
Flask は 2.0 から async def ビューに対応しています(pip install flask[async])。しかし、ここを誤解すると痛い目に遭います。公式が明確に注意しているとおり、各リクエストは依然 1 ワーカーを占有し、async ビューにしても「同時に捌けるリクエスト数」は変わりません。Flask の async が効くのは「1 ビュー内で複数の外部 API を並行呼び出しする」ような IO 並行であって、スループット向上ではありません。
本格的な async(高並行・WebSocket・ストリーミング)が要件なら、Flask と同 API で ASGI ネイティブな Quart を検討する、というのが公式の立場です。つまり、**Flask を選んだ時点で「素の高並行 async は主戦場ではない」**と割り切るのが正しい設計判断です。
2.4 型/検証の物語:境界は自分で守る
Flask には型駆動の検証がありません。API の入口(request → 内部)と出口(内部 → response)は、marshmallow や Pydantic を使って自分で守ります。私が本番で使ってきたのは marshmallow で、load() が入力検証、dump() がレスポンス整形を担い、dump_only / load_only でマスアサインメントと機密漏洩を構造として防ぎます。この設計は marshmallow × Flask × SQLAlchemy で本番 REST API を設計する に詳しく書きました。
2.5 エコシステムの成熟度
Flask は長寿で、拡張エコシステムは広大です。SQLAlchemy・Alembic・Celery・Authlib など、Flask に固有でない汎用ライブラリがそのまま使えるのが強みです。逆に言えば、「公式の正解セット」が無いため、選定の良し悪しがチームに委ねられます。
2.6 向いている場面 / 正直な弱点
向いている:小〜中規模のサービス、社内ツール、構成を一つひとつ吟味したい案件、既存の SQLAlchemy 資産がある案件、レガシーの段階的リプレース。
正直な弱点:
- 構造を自分で設計しなければならない。アプリケーションファクトリ・Blueprint・設定・コンテキスト・デプロイを設計しないと、小さなアプリがそのまま「グローバル変数と import 順序に支配されたレガシー」へ滑り落ちます。これは Flask の機能不足ではなく設計責任の問題で、本番設計の全体像は Flask 本番運用ガイド(ピラー)、大規模構成の作り方は アプリケーションファクトリ・Blueprint 大規模構成ガイド にまとめています。
- async は後付けで、高並行は主戦場ではない(§2.3)。
- 自動 API ドキュメントが無い。OpenAPI/Swagger が欲しければ別途組み込む。
💡 私の経験では、Flask の失敗の大半は「Flask が弱かった」ではなく「構造設計を省いた」ことから来ます。逆に、
create_appと層分離(Router → Schema → Model)を最初から入れた Flask は、FastAPI や Django より薄く・読みやすく・テストしやすいバックエンドになります。Flask は「自由」と引き換えに「設計の責任」を要求するフレームワークです。
3. FastAPI:型駆動の検証と、async ネイティブ
3.1 思想:標準の型ヒントで、検証・変換・ドキュメントを同時に得る
FastAPI は 標準の Python 型ヒントを基盤に API を作るモダンなフレームワークです。基盤は Starlette(ASGI Web 層)と Pydantic(データ検証)で、async def のパスオペレーションが一級市民です。最大の差別化点は、型ヒントを書くだけで、バリデーション・変換・OpenAPI スキーマ生成・対話的ドキュメントが自動で付いてくることです。
# main.py — 型ヒントが、そのまま検証とドキュメントになる
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class ItemIn(BaseModel):
name: str
price: float
@app.post("/items")
async def create_item(item: ItemIn) -> ItemIn:
# item は検証済み。不正な JSON は FastAPI が 422 で弾く
return item
このコードだけで、/docs(Swagger UI)と /redoc(ReDoc)に対話的な API ドキュメントが自動生成されます。これは Flask/Django には無い、FastAPI 固有の即効性です。
3.2 async ネイティブ:ここが Flask との決定的な差
FastAPI は ASGI の上に立つため、async def で書いた IO バウンドの処理を本当に並行で捌けます。高並行のネットワーク IO、WebSocket、ストリーミングレスポンスが主戦場です。ただし、ここには Flask とは別種の落とし穴があります——async def の中で同期ブロッキング処理(await できない DB ライブラリ等)を呼ぶと、イベントループを止めて API 全体がフリーズします。async def と通常の def の使い分けには規律が要ります。この判断基準は、本サイトの FastAPI 本番運用ガイド に詳述しました(async の使いどころが FastAPI 最大のレバレッジであり、最大の落とし穴です)。
3.3 型/検証の物語:Pydantic が中核
FastAPI の検証は Pydantic がすべてです。入力モデルと出力モデルを分け、外部 API の JSON も model_validate で即モデル化する——「境界でデータを殺す」設計が、型ヒント一本で書けます。Pydantic v2 のコア検証は Rust で書かれており高速です。Pydantic そのものの設計は Pydantic v2 本番バリデーション・型安全ガイド を参照してください。FastAPI を選ぶ= Pydantic を中核に据える、ということです。
3.4 含むもの / 含まないもの
| カテゴリ | FastAPI の扱い |
|---|---|
| ルーティング・async | 内蔵(Starlette) |
| 入出力バリデーション | 内蔵(Pydantic 型ヒント) |
| OpenAPI / Swagger UI / ReDoc | 自動生成 |
| 依存性注入(DI) | 内蔵(Depends) |
| ORM | なし(SQLAlchemy 等を足す) |
| マイグレーション | なし(Alembic 等) |
| 管理画面 | なし |
| 認証 | プリミティブ(OAuth2 等のユーティリティ)あり。実装は自分で |
つまり FastAPI は「API に必要な部分(検証・ドキュメント・DI)はバッテリー同梱、Web アプリ全体(ORM・管理・認証)は自分で組む」という中間的な立ち位置です。
3.5 向いている場面 / 正直な弱点
向いている:高並行の IO バウンド API、マイクロサービス、型安全な API 契約をチームで共有したい案件、フロントエンド(TypeScript)と OpenAPI で型を揃えたい案件、AI/ML の推論 API。
正直な弱点:
- いまだ 0.x 系。安定して広く使われてはいますが、バージョンは 1.0 未満で、マイナー更新に破壊的変更が混じることがあります。バージョン固定(
==)と CHANGELOG 追従の運用規律が要ります。 - バッテリーは API 止まり。ORM・マイグレーション・管理画面・認証は依然として自分で組み立てます。Django のような「全部入り」を期待すると肩透かしを食らいます。
- async 正しさの規律が必須(§3.2)。
4. Django:バッテリー同梱と、規約の力
4.1 思想:規約に従えば、最短で「Web アプリ全体」が立つ
Django は 「バッテリー同梱(batteries-included)」 のフルスタックフレームワークです。ORM・自動管理画面・認証/権限・マイグレーション・フォーム・テンプレートを最初から同梱し、MTV(Model-Template-View)アーキテクチャという規約に沿って組み立てます。WSGI と ASGI の両方に対応します。
最大の武器は **django-admin(自動管理画面)**です。モデルを定義し数行登録するだけで、CRUD・検索・権限付きの管理 UI が自動生成されます。これは Flask/FastAPI には存在しない、Django 固有の即効性です。
# models.py — モデルを定義し…
from django.db import models
class Article(models.Model):
title = models.CharField(max_length=200)
body = models.TextField()
published_at = models.DateTimeField(null=True, blank=True)
# admin.py — 数行登録するだけで、CRUD 管理画面が自動で生える
from django.contrib import admin
from .models import Article
admin.site.register(Article)
4.2 含むもの / 含まないもの
| カテゴリ | Django の扱い |
|---|---|
| ORM | 内蔵(Django ORM) |
| マイグレーション | 内蔵(makemigrations / migrate) |
| 管理画面 | 内蔵(自動生成) |
| 認証・権限 | 内蔵 |
| フォーム | 内蔵 |
| テンプレート | 内蔵 |
| REST API | DRF(Django REST Framework)を足すのが標準 |
| async | 部分対応(ビュー・ORM の一部) |
4.3 API の話:DRF が標準
Django で JSON API を作るなら、Django REST Framework(DRF) を載せるのが定石です。DRF の Serializer が入出力の検証/整形を担います。ただし、FastAPI のような「型ヒント=検証=自動 OpenAPI」の一体感はなく、Serializer を別途書く分の記述量があります。「API 専業なら FastAPI、管理画面付き Web アプリの一部として API も要るなら Django + DRF」 が大まかな分岐です。
4.4 async の物語:部分対応
Django は async ビューと一部の async ORM に対応していますが、FastAPI のような async ネイティブではありません。エコシステム全体がまだ同期前提の箇所を多く含むため、「高並行 async が主目的」なら FastAPI の方が素直です。
4.5 向いている場面 / 正直な弱点
向いている:コンテンツ管理・CRUD 中心の Web アプリ全体、管理画面と認証が即・必須の案件、規約に乗ってチームで速く作りたい案件、社内業務システム。
正直な弱点:
- 重く、意見が強い(opinionated)。Django の規約に乗らない要件では、かえって戦いになります。「核だけ欲しい」案件には過剰です。
- API 専業には冗長。純粋な JSON API なら DRF の記述量や ORM の縛りが、FastAPI の軽さに対して重く感じられます。
- async は部分的(§4.4)。
5. 意思決定フレームワーク:シナリオ → 推奨
ここまでの各論を、実際の要件に落とし込みます。あなたの案件がどの行に最も近いかで、出発点が決まります。
| あなたのシナリオ | 第一候補 | 理由 | 次点 |
|---|---|---|---|
| REST/JSON API が中心。型契約をフロントと共有したい | FastAPI | 型ヒント=検証=自動 OpenAPI | Flask + marshmallow |
| 高並行の IO バウンド・WebSocket・ストリーミング | FastAPI | ASGI で真の async 並行 | Quart |
| 管理画面・認証・ORM が今すぐ・必須 | Django | 全部同梱、admin が自動生成 | — |
| コンテンツ/CRUD 中心の Web アプリ全体 | Django | MTV 規約で最短到達 | Flask |
| 構成を一つひとつ自分で選びたい・薄く作りたい | Flask | 核だけ・拡張で組む | FastAPI |
| 小さく始めて、要件に合わせて拡張したい | Flask | 最小から段階的に肥やせる | FastAPI |
| 既存の SQLAlchemy / Flask 資産・チームスキルがある | Flask | 学習コストと移行コストが最小 | FastAPI |
| AI/ML の推論 API(型安全な入出力) | FastAPI | Pydantic で入出力を厳密化 | Flask |
| 社内業務システム(権限管理が肝) | Django | 認証/権限/admin が同梱 | Flask |
| マイクロサービスを多数・軽量に並べる | FastAPI | 軽量・async・自動ドキュメント | Flask |
💡 意思決定の三つの問いでも整理できます。①「管理画面・認証・ORM を今すぐ全部欲しいか?」→ Yes なら Django。②(No なら)「高並行 async・型駆動の API が主目的か?」→ Yes なら FastAPI。③(どちらも No なら)「構成を自分で選び、薄く作りたいか?」→ Yes なら Flask。この順で問えば、たいていの案件は自然に一つへ収束します。
6. Flask を選ぶべきとき / 選ぶべきでないとき(正直版)
私自身が Flask を本番で運用してきたからこそ、ここははっきり書きます。
6.1 Flask を選ぶべきとき
- 構成を吟味して選びたい:ORM・検証・認証・タスクキューを、案件に最適なものを一つずつ選びたい。
- 小〜中規模で薄く作りたい:機能を盛らず、要件に最小フィットさせたい。
- 既存資産がある:SQLAlchemy / marshmallow / 既存の Flask コードベースがあり、学習・移行コストを抑えたい。
- 同期処理が主体:典型的な CRUD・業務ロジックで、超高並行 async が要件ではない。
- 設計を引き受ける覚悟がある:
create_app・Blueprint・層分離を最初から入れられる(大規模構成ガイド)。
6.2 Flask を選ぶべきでないとき
- 高並行の async が主目的:WebSocket・大量同時接続・ストリーミングが中心なら FastAPI(または Quart)。
- 管理画面・認証・ORM を即・全部欲しい:自作の手間を払いたくないなら Django。
- 自動 API ドキュメントを前提にしたい:OpenAPI/Swagger を「書かずに得たい」なら FastAPI。
- 型駆動の API 契約をチームの規律にしたい:Pydantic を中核に据えるなら FastAPI。
- 設計を引き受ける体制が無い:構造設計を省く運用になりそうなら、規約で守ってくれる Django の方が事故が少ない。
⚠️ 最後の点は重要です。Flask の「自由」は、設計規律とセットでなければ負債になります。チームに設計を担保する仕組みが無いなら、規約の強い Django の方が結果的に安全なことがあります。「自由=善」ではありません。
7. 移行と併存:三者は地続きである
技術選定は「一度きりの賭け」ではありません。三者は思っているより地続きで、移行・併存の現実的な道があります。
7.1 部品は共有できる
- Flask ↔ FastAPI:marshmallow / Pydantic / SQLAlchemy は、いずれもフレームワーク非依存です。永続化層(SQLAlchemy モデル)や検証ロジックを共有したまま、Web 層だけを差し替えられます。SQLAlchemy 2.0 の設計は SQLAlchemy 2.0 型付き ORM 実践ガイド を参照してください(Flask でも FastAPI でも同じ ORM が使えます)。
7.2 ゲートウェイ背後で併存させる
API Gateway や ALB の背後で、Flask アプリと FastAPI アプリをパスで振り分けて併存させられます。新規エンドポイントだけ FastAPI で書き、既存は Flask のまま——という段階移行が現実的です。私が運用してきた木材流通 SaaS でも、API Gateway → ALB → ECS でサービスを束ねる構成でした。リスクを一括移行に集中させず、エンドポイント単位で移せます。
7.3 Flask の async 逃げ道:Quart
Flask の構文に慣れたチームが async を必要としたとき、Quart(Flask と互換 API の ASGI フレームワーク)への移行は、ゼロから FastAPI を学ぶより段差が小さいことがあります。「Flask のまま async に寄せる」選択肢として頭の片隅に置いてください。
[ クライアント ]
│
[ API Gateway / ALB ]
├── /api/legacy/* → Flask アプリ(既存・同期)
└── /api/v2/* → FastAPI アプリ(新規・async)
💡 「最初に完璧な選択をしなければ」と気負う必要はありません。部品(ORM・検証)を共有可能な形に保ち、Web 層を疎結合にしておけば、後から移せます。技術選定は可逆性を残せる——これが、ベンダー選定や調達の観点とも通じる発注の知恵です(システム開発外注ガイド:ベンダー選定とコスト)。
8. FastAPI を深く知りたい人へ
本記事は「どれを選ぶか」の選定ガイドです。FastAPI を選ぶと決めた後の本番運用——async def / def の使い分け、Pydantic v2 の境界バリデーション、Depends による依存性注入、構造化ログと OpenTelemetry の可観測性、BackgroundTasks の限界とジョブ基盤への逃がし方——は、別記事に体系化しています。FastAPI 固有の設計判断は FastAPI 本番運用ガイド を参照してください。同様に、Flask を選んだ後の本番設計は Flask 本番運用ガイド が出発点です。
まとめ:推奨マトリクス
最後に、判断を一枚に凝縮します。
| もし… | 選ぶべきは | 一言 |
|---|---|---|
| 高並行・型安全な API が主目的 | FastAPI | ASGI と Pydantic が主戦場。ただし 0.x のバージョン規律を持つ |
| 管理画面・認証・ORM が即・必須 | Django | 全部入り。規約に乗れば最短。API は DRF |
| コンテンツ/CRUD の Web アプリ全体 | Django | MTV 規約と admin で速く立つ |
| 構成を自分で選び、薄く作りたい | Flask | 核だけ。自由と引き換えに設計責任 |
| 小さく始めて段階的に拡張 | Flask | 最小から肥やせる。後で移行も可 |
| 既存 SQLAlchemy/Flask 資産がある | Flask | 学習・移行コスト最小 |
| 設計を担保する体制が無い | Django | 規約が事故を減らす |
三者は競合ではなく住み分けです。Flask は「最大の制御と最小の核」、FastAPI は「型駆動の検証と async・自動ドキュメント」、Django は「規約と網羅性で最短到達」。あなたの要件を §5 の三つの問いに通せば、出発点は自然に決まります。そして §7 のとおり、部品を疎結合に保てば後から移せる——だから、完璧主義に陥らず、いまの要件に最小フィットする一つを選んでください。それが、長く価値を持つバックエンドへの近道です。