Python で Web サービスや API を開発するとき、最初に悩むのがフレームワーク選びです。Django、FastAPI、Flask……名前は聞いたことがあっても、「自分のプロジェクトにはどれが合うのか」が分からないまま選んでしまうケースは少なくありません。
この記事では、Python で実際に使われる 8 つの Web フレームワークを用途・難易度・速度・非同期対応の軸で比較し、それぞれの実装例とともに「どんな場面で選ぶべきか」を整理します。
8 フレームワークの比較一覧
| フレームワーク | 主な用途 | 難易度 | 速度 | 非同期 | 特徴 |
|---|---|---|---|---|---|
| Django | 大規模 Web サイト | 中 | 普通 | △ | フルスタック・全部入り |
| FastAPI | API 全般 | 低 | ◎ | ◎ | 型ヒント・Swagger 自動生成 |
| Flask | 小規模・プロトタイプ | 低 | 普通 | × | 超軽量・自由設計 |
| Sanic | 高速 async API | 中 | ◎ | ◎ | async 特化・Flask 風記法 |
| Quart | Flask の async 化 | 中 | 高 | ◎ | Flask 互換 API |
| Tornado | 非同期・長時間接続 | 高 | 高 | ◎ | 古参 async・独自 I/O ループ |
| Pyramid | 中規模・柔軟設計 | 中 | 普通 | △ | スケーラブル設計思想 |
| Falcon | API 特化・高性能 | 中 | ◎ | △ | REST API 最速クラス |
ポイントは「有名だから」「新しいから」ではなく、プロジェクトの規模と要件に合ったフレームワークを選ぶことです。結論を先に言えば、API なら FastAPI、大規模 Web サイトなら Django、小さなプロトタイプなら Flask — この 3 つだけで 9 割のケースはカバーできます。
Django ― フルスタックの王道
Django は Python で最も有名な Web フレームワークです。認証、管理画面(Django Admin)、ORM、セッション管理、CSRF 保護など、Web アプリに必要な機能が標準で全部揃っているのが最大の特徴です。「バッテリー同梱(Batteries Included)」という哲学のもと、サードパーティライブラリを探し回る必要がありません。
Instagram、Mozilla、Pinterest など、大規模なサービスの実績もあり、長期運用のプロジェクトで選ばれることが多いです。
from django.http import JsonResponse
from django.views import View
class UserView(View):
def get(self, request, user_id):
return JsonResponse({
"user_id": user_id,
"name": "Alice",
})
# urls.py: path('users//', UserView.as_view())
いつ使う?
- 企業向け Web サービス、社内システム
- 管理画面が必要なプロジェクト(Django Admin が即使える)
- EC サイト、CMS(コンテンツ管理システム)
- 認証・権限管理が複雑なアプリケーション
Django の最大の武器は Django Admin です。モデルを定義するだけで、データの CRUD 操作ができる管理画面が自動生成されます。社内ツールや管理系の機能なら、フロントエンドを書かずに運用を開始できるため、開発コストが劇的に下がります。
Django は「全部入り」ゆえに、学習コストが高めです。初心者が最初に Django を選ぶと、ORM、テンプレートエンジン、ミドルウェア、URL ルーティングと覚えることが多すぎて挫折しがちです。API だけ作りたいなら FastAPI、シンプルな Web アプリなら Flask から始める方が入門しやすいです。
pip でインストールできます。
pip install django
FastAPI ― 現代 Python API の決定版
FastAPI は、Python の型ヒント(Type Hints)をフル活用した高速 API フレームワークです。リクエストの自動バリデーション、Swagger UI / ReDoc による API ドキュメント自動生成、ネイティブの async/await 対応と、モダンな API 開発に必要な機能がワンパッケージで揃います。
パフォーマンスは Node.js や Go に匹敵するレベルで、Python フレームワークの中ではトップクラスです。2020 年以降、急速にシェアを伸ばし、現在では API 開発のデファクトスタンダードと言える存在です。
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class User(BaseModel):
name: str
age: int
@app.post("/users/")
async def create_user(user: User):
return {"message": f"{user.name} (age {user.age}) created"}
# POST /users/ {"name":"Alice","age":30}
# → {"message": "Alice (age 30) created"}
いつ使う?
- REST API / GraphQL バックエンド
- AI・機械学習モデルの API 化
- ツールサイトのバックエンド
- マイクロサービス
FastAPI の /docs(Swagger UI)は、フロントエンド開発者やクライアントとの API 仕様の共有にそのまま使えます。ドキュメントを別途書く必要がないため、チーム開発でのコミュニケーションコストが大幅に下がります。また、Pydantic モデルによるバリデーションは、入力チェックのコードをほぼゼロにしてくれます。
FastAPI は API フレームワークであり、HTML テンプレートのレンダリングは得意ではありません。管理画面や CMS のような「画面付きの Web サイト」を作るなら Django の方が適しています。また、async の恩恵を受けるには Uvicorn や Gunicorn + UvicornWorker でのデプロイが必要な点も注意です。
pip でインストールできます。
pip install fastapi uvicorn
Flask ― ミニマリストの軽量フレームワーク
Flask は「マイクロフレームワーク」を名乗る、Python で最もシンプルな Web フレームワークです。コアは極めて小さく、必要な機能だけを拡張で追加していく設計思想です。
学習コストが極めて低いため、Python で Web 開発を学ぶ入門フレームワークとして広く使われています。小規模なプロトタイプや社内ツールにも最適です。
from flask import Flask, jsonify
app = Flask(__name__)
@app.route("/users/")
def get_user(user_id):
return jsonify({"user_id": user_id, "name": "Alice"})
# GET /users/1 → {"user_id": 1, "name": "Alice"}
いつ使う?
- プロトタイプ・PoC(概念実証)の高速開発
- Python Web 開発の学習
- 社内向けの小規模ツール
- シンプルな API サーバー
Flask のエコシステムは非常に豊富です。Flask-SQLAlchemy(ORM)、Flask-Login(認証)、Flask-CORS(CORS 対応)など、必要な機能を拡張パッケージで後付けできます。「最初はシンプルに、必要になったら足す」という開発スタイルに最適です。
Flask で大規模アプリケーションを作ると、プロジェクト構成の設計をすべて自分で行う必要があります。Blueprint の分割、DB マイグレーション、認証の仕組みなど、Django なら標準で用意されているものを自力で組み立てることになり、規模が大きくなるほど設計力が問われます。
pip でインストールできます。
pip install flask
Sanic ― async 特化の高速フレームワーク
Sanic は async/await をネイティブに前提とした高速 Web フレームワークです。Flask に似た直感的な記法でありながら、内部は完全に非同期で動作し、uvloop を活用した高いスループットが特徴です。
FastAPI が登場する前は「Python で高速な非同期 API を作る」選択肢として最も注目されていました。現在でも、より低レベルな制御が必要な場面で選ばれています。
from sanic import Sanic
from sanic.response import json
app = Sanic("MyApp")
@app.get("/users/")
async def get_user(request, user_id):
return json({"user_id": user_id, "name": "Alice"})
# GET /users/1 → {"user_id": 1, "name": "Alice"}
いつ使う?
- 高スループットが求められる API
- リアルタイム通信を伴うサービス
- FastAPI の Pydantic に依存したくない場合
- async/await に精通した開発者のプロジェクト
Sanic は組み込みの WebSocket サポートを持っており、リアルタイム機能を追加ライブラリなしで実装できます。また、ミドルウェアやシグナルの仕組みが充実しており、リクエストライフサイクルを細かく制御できます。
Sanic のエコシステムは FastAPI や Flask と比べて小さめです。ORM、認証、バリデーションなどを自分で組み合わせる必要があり、FastAPI のような「型ヒントだけでバリデーション完了」という手軽さはありません。async の理解が前提となるため、初心者にはハードルが高いです。
pip でインストールできます。
pip install sanic
Quart ― Flask の async 版
Quart は Flask とAPI 互換の非同期 Web フレームワークです。Flask のコードをほぼそのまま async 化できるのが最大の特徴で、既存の Flask プロジェクトを非同期に移行したい場合の有力な選択肢です。
Flask の拡張パッケージの多くがそのまま動作するため、Flask エコシステムの資産を活かしつつ async の恩恵を受けられます。
from quart import Quart, jsonify
app = Quart(__name__)
@app.route("/users/")
async def get_user(user_id):
return await jsonify({"user_id": user_id, "name": "Alice"})
# GET /users/1 → {"user_id": 1, "name": "Alice"}
いつ使う?
- 既存の Flask プロジェクトを async 化したい
- Flask のエコシステムを維持しつつ非同期対応したい
- WebSocket を Flask 風の記法で扱いたい
Quart は Flask からの移行がほぼ「def を async def に変える」だけで済むケースが多いです。Flask-SQLAlchemy などの一部拡張も互換レイヤーを通して使えます。「Flask は好きだけど async が必要になった」というシナリオに最適です。
新規プロジェクトなら、最初から FastAPI を選ぶ方が合理的なケースがほとんどです。Quart の強みは「Flask からの移行コストの低さ」にあるため、ゼロから作るなら Quart を積極的に選ぶ理由は薄いです。
pip でインストールできます。
pip install quart
Tornado ― 古参の非同期フレームワーク
Tornado は 2009 年に FriendFeed(後に Facebook が買収)が公開した、Python の非同期 Web フレームワークの先駆者です。独自の I/O ループを持ち、asyncio が標準化される以前から非同期処理を実現していました。
長時間接続(Long Polling、WebSocket)の処理に強く、リアルタイムアプリケーションの基盤として今でも使われています。
import tornado.ioloop
import tornado.web
class MainHandler(tornado.web.RequestHandler):
def get(self):
self.write({"message": "Hello Tornado"})
app = tornado.web.Application([
(r"/", MainHandler),
])
app.listen(8888)
tornado.ioloop.IOLoop.current().start()
いつ使う?
- Long Polling / WebSocket を多用するリアルタイムサービス
- 既存の Tornado ベースのシステムの保守・拡張
- 非同期 I/O を細かく制御したい場面
Tornado は非同期 HTTP クライアント(tornado.httpclient.AsyncHTTPClient)も内蔵しています。外部 API を並列に呼び出すサーバーサイドの処理に便利で、フレームワーク単体で完結する設計がしやすいです。
Tornado の独自 I/O ループは、asyncio との統合が可能ですが完全にシームレスではありません。新規プロジェクトで非同期 Web を作るなら、asyncio ネイティブの FastAPI や Sanic の方がエコシステムの恩恵を受けやすいです。Tornado は「既存資産の活用」または「独自の非同期制御が必要」な場合に選びましょう。
pip でインストールできます。
pip install tornado
Pyramid ― スケーラブルな柔軟設計
Pyramid は「小さく始めて大きく育てる」を設計思想とするフレームワークです。Flask のようにシンプルに始められつつ、Django のような大規模アプリケーションにもスケールする — その中間を狙ったポジションです。
URL ルーティング、認証ポリシー、テンプレートエンジンの選択など、各コンポーネントを自由に組み合わせられる柔軟性が特徴です。
from pyramid.config import Configurator
from pyramid.response import Response
import json
def hello(request):
return Response(
json.dumps({"message": "Hello Pyramid"}),
content_type="application/json"
)
with Configurator() as config:
config.add_route("home", "/")
config.add_view(hello, route_name="home")
app = config.make_wsgi_app()
いつ使う?
- 中規模のアプリケーションで、Django ほどの機能は不要だがFlask では不足する場合
- 特定の ORM やテンプレートエンジンを自分で選びたい
- 長期間にわたる段階的な機能追加が見込まれるプロジェクト
Pyramid の認証・認可(Authorization)の仕組みは非常に洗練されています。ACL(アクセス制御リスト)ベースの権限管理を標準サポートしており、複雑な権限モデルが必要なアプリケーションでは Django よりも柔軟に対応できます。
Pyramid はコミュニティの規模が Django や Flask と比べて小さく、情報を探すのに苦労することがあります。日本語の情報はさらに少ないため、英語ドキュメントを読む力が求められます。「自由度が高い」は裏を返せば「決めることが多い」ということでもあります。
pip でインストールできます。
pip install pyramid
Falcon ― REST API 最速クラス
Falcon は REST API に特化した、極めて高速かつ軽量なフレームワークです。余計な機能を一切持たず、HTTP リクエスト/レスポンスの処理に集中することで、Python フレームワークの中でもトップクラスのレスポンスタイムを実現しています。
LinkedIn や Rackspace などの大規模なプロダクション環境でも採用実績があります。
import falcon
import json
class UserResource:
def on_get(self, req, resp, user_id):
resp.content_type = falcon.MEDIA_JSON
resp.text = json.dumps(
{"user_id": int(user_id), "name": "Alice"}
)
app = falcon.App()
app.add_route("/users/{user_id}", UserResource())
いつ使う?
- レスポンスタイムが極めて重要な API
- マイクロサービスの軽量 API ゲートウェイ
- HTTP の低レベルな制御が必要な場面
- フレームワークのオーバーヘッドを最小限にしたい
Falcon はミドルウェアの仕組みがシンプルで高速です。認証、ロギング、レート制限などをミドルウェアとして積み重ねても、オーバーヘッドが最小限に抑えられます。「API のパフォーマンスだけは絶対に妥協できない」というシナリオに向いています。
Falcon は意図的に機能を絞っています。テンプレートエンジン、ORM、フォーム処理、セッション管理などは一切含まれていません。「API 以外のこともやりたい」場合は FastAPI や Django を選んでください。また、FastAPI の自動ドキュメント生成に相当する機能はないため、API ドキュメントは別途用意する必要があります。
pip でインストールできます。
pip install falcon
フレームワーク選択ガイド + 実務構成パターン
ここまで 8 つのフレームワークを見てきました。実務では「どれか 1 つ」だけでなく、プロジェクトの規模と目的に応じて選び分けるのが重要です。以下に、典型的なプロジェクト別の定番構成を示します。
| プロジェクト | 推奨 | 理由 |
|---|---|---|
| ツールサイトの API | FastAPI | 高速・型安全・ドキュメント自動生成 |
| 企業 Web サイト | Django | 管理画面・認証・ORM が標準装備 |
| AI / ML モデルの API 化 | FastAPI | Pydantic との相性、async 対応 |
| プロトタイプ・学習 | Flask | 学習コスト最小・高速に動くものが作れる |
| 高スループット API | FastAPI / Sanic | async ネイティブ・ベンチマーク上位 |
| Flask の async 移行 | Quart | Flask 互換 API でスムーズな移行 |
| リアルタイム (WebSocket) | FastAPI / Tornado | 長時間接続の安定性 |
| API パフォーマンス最優先 | Falcon | 最小オーバーヘッド |
初心者が陥りやすい失敗パターン:
- 最初に Django を選んで挫折する → 覚えることが多すぎる。まずは Flask か FastAPI で「動くもの」を作る経験を積むのが先
- Flask で大規模アプリを作ってしまう → 設計が破綻する。一定規模を超えたら Django への移行を検討すべき
- async を理解せず FastAPI / Sanic を使う → 同期ライブラリ(requests など)を async の中で呼んでブロックしてしまう
- 流行で選ぶ → フレームワークは道具。プロジェクトの要件に合っているかが最も重要
共通するのは「過剰設計の罠」です。小規模なプロジェクトに Django のフルスタックは不要ですし、単純な API に Tornado の低レベル制御も必要ありません。シンプルに始めて、必要になったら拡張する — これが実務で最も成功率の高いアプローチです。
まとめ
Python の Web フレームワークは、用途で選べば迷いません。
- API 全般 → FastAPI
- 大規模 Web サイト → Django
- プロトタイプ・学習 → Flask
- 高速 async API → Sanic
- Flask の async 化 → Quart
- リアルタイム・長時間接続 → Tornado
- 柔軟設計の中規模 → Pyramid
- API パフォーマンス最優先 → Falcon
迷ったら、API なら FastAPI、Web サイトなら Django、小規模なら Flask。この 3 つだけで大抵のプロジェクトはカバーできます。フレームワーク選びに時間をかけすぎるより、まずは手を動かして「動くもの」を作ることが一番の近道です。

コメントを残す