3.

Python の Web フレームワーク比較 — Django / Flask / FastAPI の選び方

編集
この記事の要点
  • Python の Web フレームワーク御三家は Django (フル) / Flask (マイクロ) / FastAPI (型ヒント+非同期)
  • Django: 管理画面・ORM・認証込みでスタートアップから大規模まで。 Instagram / Pinterest 採用
  • FastAPI: 2018 年登場、 OpenAPI 自動生成 + 高速。 機械学習 API の定番に
  • データサイエンス UI: Streamlit / Dash / Gradio — Python だけでダッシュボード作成
  • 選び方: 業務 Web は DjangoAPI/マイクロサービスは FastAPI軽量で学習用なら Flask

Python の主要 Web フレームワーク

フレームワークタイプ初版特徴採用事例
Djangoフルスタック2005ORM/Admin/認証同梱、 大規模対応Instagram、 Pinterest、 Disqus
Flaskマイクロ2010最小コア、 拡張で組み立てNetflix、 LinkedIn 一部
FastAPIAPI/ASGI2018型ヒント、 非同期、 OpenAPI 自動Uber、 Microsoft、 Netflix
Pyramid柔軟系2010小〜大規模で同じコードMozilla, Yelp
Tornado非同期2009長時間接続・WebSocketFriendFeed(Facebook 買収)
Bottleマイクロ2009単一ファイル、 学習用小規模ツール多数
Sanic非同期2016Flask 風 API、 uvloop で高速ベンチ系
Litestar (旧 Starlite)API/ASGI2021FastAPI 代替、 機能豊富新興

Django — フルスタックの王道

「Web 開発のすべて」をパッケージにしたフレームワーク。 管理画面・ORM・認証・テンプレート・国際化・セキュリティが標準同梱。 1 つの大きなアプリを作るのに最適。

# Django: 最小コード(実際は startproject で雛形生成)
# views.py
from django.http import HttpResponse

def hello(request):
    return HttpResponse("Hello, Django!")

# urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('hello/', views.hello),
]

# Model
from django.db import models
class Article(models.Model):
    title = models.CharField(max_length=200)
    body = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)

# 起動
# python manage.py runserver

使うべき場面: CMS / 業務 Web / EC / コミュニティサイト / 管理画面が必要なシステム

Flask — マイクロフレームワーク

核は最小、 必要なものは自分で選ぶ」哲学。 ORM (SQLAlchemy) ・認証 (Flask-Login) ・フォーム (WTForms) を必要に応じて追加。

# Flask: シンプル API
from flask import Flask, request, jsonify

app = Flask(__name__)

@app.route('/')
def hello():
    return "Hello, Flask!"

@app.route('/users/')
def get_user(user_id):
    return jsonify({"id": user_id, "name": f"User{user_id}"})

@app.route('/items', methods=['POST'])
def create_item():
    data = request.get_json()
    return jsonify({"created": data}), 201

if __name__ == '__main__':
    app.run(debug=True)

使うべき場面: 小〜中規模 API、 プロトタイプ、 学習、 既存システムへの組み込み

FastAPI — 型ヒント + 非同期

2018 年登場の新世代。 Python 型ヒントから入力検証・OpenAPI ドキュメント・JSON シリアライズを自動生成。 ASGI で非同期 I/O に対応。

# FastAPI: 型ヒントベース
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from typing import Optional

app = FastAPI(title="My API", version="1.0.0")

class User(BaseModel):
    name: str
    age: int
    email: Optional[str] = None

@app.get("/")
async def root():
    return {"msg": "Hello, FastAPI!"}

@app.post("/users/", response_model=User)
async def create_user(user: User):
    # 入力検証は Pydantic が自動
    if user.age < 0:
        raise HTTPException(status_code=400, detail="age must be >= 0")
    return user

@app.get("/users/{user_id}")
async def get_user(user_id: int):
    return {"id": user_id, "name": f"User{user_id}"}

# 起動
# uvicorn main:app --reload
# OpenAPI ドキュメント: http://localhost:8000/docs (Swagger UI)
# Redoc:               http://localhost:8000/redoc

使うべき場面: マイクロサービス API、 機械学習モデルの提供、 OpenAPI ファースト開発

非同期系: Tornado / Sanic / Litestar

# Tornado — 老舗の非同期フレームワーク
import tornado.web
import tornado.ioloop

class MainHandler(tornado.web.RequestHandler):
    async def get(self):
        # 非同期 DB アクセス等
        self.write("Hello, Tornado!")

app = tornado.web.Application([(r"/", MainHandler)])
app.listen(8888)
tornado.ioloop.IOLoop.current().start()

# Sanic — Flask 風 + 非同期
from sanic import Sanic
from sanic.response import json

app = Sanic("MyApp")

@app.get("/")
async def hello(request):
    return json({"hello": "sanic"})

# 起動
# sanic main:app --host 0.0.0.0 --port 8000

データサイエンス UI フレームワーク

Python だけで分析ダッシュボードや機械学習デモを作れるツール群:

ツール用途特徴
Streamlit分析ダッシュボードスクリプト的にコードを書くだけで UI に
Dash (Plotly)BI ダッシュボード本格的、 コールバックベース、 商用利用多
GradioML デモ UIHuggingFace Spaces の標準、 共有 URL 自動
Panel科学計算ダッシュボードHoloViz、 Jupyter 連携強
VoilaJupyter 直接公開Notebook をそのまま Web に
Shiny for PythonR 出身者向けRStudio (Posit) 製、 リアクティブ
# Streamlit: わずか数行でダッシュボード
import streamlit as st
import pandas as pd

st.title("売上ダッシュボード")

df = pd.read_csv("sales.csv")
st.dataframe(df)

month = st.selectbox("月", df['month'].unique())
filtered = df[df['month'] == month]
st.bar_chart(filtered.set_index('product')['sales'])

# 起動: streamlit run app.py

# Gradio: ML モデルの即席 UI
import gradio as gr

def classify(image):
    # 何らかの ML 推論
    return {"cat": 0.8, "dog": 0.2}

demo = gr.Interface(fn=classify, inputs="image", outputs="label")
demo.launch()

選び方フローチャート

  • 管理画面が必要 / 認証必須 / 業務 WebDjango
  • REST API のみ / マイクロサービス / ML モデル提供FastAPI
  • 軽量プロトタイプ / 学習 / 既存への組込みFlask
  • WebSocket / 長時間接続が必要Tornado / Sanic / FastAPI
  • データ分析の即席 UIStreamlit / Gradio
  • 本格的 BI ダッシュボードDash
  • 大規模・両極端対応Pyramid

学習曲線とエコシステム

項目DjangoFlaskFastAPI
学習曲線急 (規約多)緩 (自由)中 (型ヒント前提)
ドキュメント豊富・公式が網羅シンプル、 拡張ごと公式が秀逸(チュートリアル形式)
非同期4.1+ で対応 (ASGI)2.0+ で部分対応ネイティブ
ORMDjango ORM 同梱SQLAlchemy 自前SQLAlchemy / Tortoise
管理画面標準同梱Flask-Admin 等SQLAdmin 等
テスト標準 test ランナーpytest + Flask 拡張pytest + TestClient
本番運用gunicorn + nginxgunicorn + nginxuvicorn + nginx

人気度の推移

GitHub Star 数 (2026 年時点目安):

  • Django: 78k+ — 安定して伸び
  • FastAPI: 75k+ — 2020 年以降急上昇、 Django に追いつく勢い
  • Flask: 67k+ — 緩やかに伸び
  • Streamlit: 33k+ — データサイエンス需要で急成長
  • Gradio: 32k+ — LLM 時代に大躍進

JetBrains の年次調査でも FastAPI が 2020 年の 14% から 2024 年に 29%へ倍増、 Django 47% / Flask 39% を脅かす存在になりました。

FAQ

Q: Django と Flask、 どちらから学ぶ?
A: Django 推奨。 Web 開発に必要な要素が一通り入っているため全体像が掴みやすい。 Flask は「自由ゆえに迷う」段階を後回しに。

Q: FastAPI で SSR (テンプレート HTML) できる?
A: できますが本領ではない。 Jinja2 でテンプレート使えますが、 HTML を返すなら Django、 API なら FastAPI が役割分担。

Q: Streamlit と Dash の違い?
A: Streamlit はスクリプト的でとにかく速い、 Dash は本格 BI でコールバック設計が必要。 試作は Streamlit、 製品化は Dash が定番。

編集
Post Share
子ページ
  1. django
同階層のページ
  1. 環境構築
  2. 文法
  3. フレームワーク
  4. ライブラリ
  5. バージョンの確認
  6. エラー一覧
  7. Webスクレイピング
  8. Excelの読み込み/書き込み操作(openpyxl編)
  9. Excelのセルの値を読み込む方法(xlrd編)
  10. ローカルで独立して動くPythonプログラムとパッケージの事前インストール方法
  11. プログラム実行時のパスを取得