メインコンテンツへスキップ
友田 陽大
Flask 本番運用
Python
Flask
FastAPI
Django
技術選定
アーキテクチャ設計
バックエンド

Flask vs FastAPI vs Django 技術選定ガイド:どの場面でどれを選ぶか(2026年版・本番運用の判断軸)

Flask・FastAPI・Django の違いを本番運用の視点で比較する技術選定ガイド。アーキテクチャ思想、同期/非同期、型検証、管理画面、学習曲線、現行版を表で整理し、REST API・高並行IO・管理画面即用・段階移行などシナリオ別に推奨フレームワークを示します。Flask FastAPI Django 違い 比較 選定の決定版。

公開日
読了時間
19分
著者
友田 陽大
シェア
目次

導入:「どれが優れているか」は誤った問い

「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

この直感を、まず一枚の表で全体像にします。以降の各セクションは、この表の各行を掘り下げたものです。

観点FlaskFastAPIDjango
思想マイクロ(核だけ・自分で組む)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)は、marshmallowPydantic を使って自分で守ります。私が本番で使ってきたのは 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 APIDRF(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型ヒント=検証=自動 OpenAPIFlask + marshmallow
高並行の IO バウンド・WebSocket・ストリーミングFastAPIASGI で真の async 並行Quart
管理画面・認証・ORM が今すぐ・必須Django全部同梱、admin が自動生成
コンテンツ/CRUD 中心の Web アプリ全体DjangoMTV 規約で最短到達Flask
構成を一つひとつ自分で選びたい・薄く作りたいFlask核だけ・拡張で組むFastAPI
小さく始めて、要件に合わせて拡張したいFlask最小から段階的に肥やせるFastAPI
既存の SQLAlchemy / Flask 資産・チームスキルがあるFlask学習コストと移行コストが最小FastAPI
AI/ML の推論 API(型安全な入出力)FastAPIPydantic で入出力を厳密化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 ↔ FastAPImarshmallow / 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 が主目的FastAPIASGI と Pydantic が主戦場。ただし 0.x のバージョン規律を持つ
管理画面・認証・ORM が即・必須Django全部入り。規約に乗れば最短。API は DRF
コンテンツ/CRUD の Web アプリ全体DjangoMTV 規約と admin で速く立つ
構成を自分で選び、薄く作りたいFlask核だけ。自由と引き換えに設計責任
小さく始めて段階的に拡張Flask最小から肥やせる。後で移行も可
既存 SQLAlchemy/Flask 資産があるFlask学習・移行コスト最小
設計を担保する体制が無いDjango規約が事故を減らす

三者は競合ではなく住み分けです。Flask は「最大の制御と最小の核」、FastAPI は「型駆動の検証と async・自動ドキュメント」、Django は「規約と網羅性で最短到達」。あなたの要件を §5 の三つの問いに通せば、出発点は自然に決まります。そして §7 のとおり、部品を疎結合に保てば後から移せる——だから、完璧主義に陥らず、いまの要件に最小フィットする一つを選んでください。それが、長く価値を持つバックエンドへの近道です。

友田

友田 陽大

経済産業大臣賞 受賞プロダクト開発者。TypeScript + Python + AWS で、SaaS・業界DX・ 実用レベルの生成AI(RAG)を、要件定義からインフラ・運用まで一人で完遂します。

この記事で解説した技術の適用事例

経済産業大臣賞受賞 | 木材流通業界のDXを実現したB2BサブスクリプションSaaS

ケーススタディを見る