207
191

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Python実装のWebアプリケーションフレームワークOSSの比較(2022年版)

Last updated at Posted at 2022-05-26

概要

2022年現在、Pythonで実装されたWebアプリケーションのフレームワークのOSSは多数あります。それらを様々な角度から比較してみましょう。
python_fws.png

候補

2022年5月時点で、メジャーと思われるものは以下の通りです。対象はGitHubでソースコードを管理しているもので、Star数が1,000を超えているものに限定しています。READMEの最初などからOSSを最も端的に表している1文を抽出して、翻訳しています。

OSS名 ロゴ
マーク
概要 フルスタック
Django 高水準のPython Webフレームワークで、迅速な開発とクリーンで実用的な設計を促進します。
Flask 軽量なWSGI Webアプリケーションフレームワークです。複雑なアプリケーションにスケールアップする能力を持ちながら、素早く簡単に始めることができるように設計されています。WerkzeugとJinjaのシンプルなラッパーとして始まり、今では最も人気のあるPythonのWebアプリケーションフレームワークの1つになっています。
FastAPI Pythonの標準的なタイプヒントをベースに、Python 3.6+でAPIを構築するための、モダンで高速(ハイパフォーマンス)なWebフレームワークです。
Tornado もともとFriendFeedで開発されたPythonのWebフレームワークと非同期ネットワーキング・ライブラリです。ノンブロッキングネットワークI/Oを使用することで、何万ものオープンコネクションに対応でき、ロングポーリング、WebSocket、その他各ユーザーとの長期的な接続を必要とするアプリケーションに理想的なものとなっています。
Dash 機械学習やデータサイエンスのWebアプリケーションを構築するためのPythonフレームワークで、類似製品の中で最もダウンロードされ、信頼されています。
Sanic Python 3.7+のWebサーバとWebフレームワークで、高速に動作するように書かれています。Python 3.5で追加されたasync/await構文を使うことができ、コードをノンブロッキングで高速にすることができます。
AIOHTTP asyncioとPythonのための非同期HTTPクライアント/サーバです。
Falcon ミッションクリティカルなREST APIやマイクロサービスを構築するための最小限のASGI/WSGIフレームワークで、信頼性、正確性、そしてスケーリング時のパフォーマンスに重点を置いています。
Bottle Pythonのための高速でシンプルかつ軽量なWSGIマイクロウェブフレームワークです。単一ファイルのモジュールとして配布され、Python標準ライブラリ以外には依存関係がありません。
hug Python駆動APIの開発を可能な限りシンプルにすることを目的としており、Python API開発を劇的に簡素化します。
Eve 人間のために設計されたオープンソースのPython REST APIフレームワークです。高度にカスタマイズ可能で、完全な機能を持つRESTful Webサービスを簡単に構築し、デプロイすることができます。コミュニティによる拡張で、MongoDBやSQLバックエンドをネイティブにサポートしています。
Pyramid 小さく、速く、堅実な、オープンソースのPythonのWebフレームワークです。実際のWebアプリケーションの開発とデプロイを、より楽しく、より予測可能で、より生産的にします。
web2py 高速でスケーラブル、安全で移植性の高いデータベース駆動型のWebアプリケーションを迅速に開発するための、フリーのオープンソース・フルスタックフレームワークです。
Masonite モダンで開発者中心のPython Webフレームワーク。
CherryPy Pythonicでオブジェクト指向のHTTPフレームワークです。
OSS名 ライセンス 初回コミット GitHub☆数 公式サイト
Django 三条項BSD 2005年7月13日 63,991 https://www.djangoproject.com/
Flask 三条項BSD 2010年4月6日 58,936 https://flask.palletsprojects.com/
FastAP MIT 2018年12月5日 44,804 https://fastapi.tiangolo.com/
Tornado Apache 2.0 2009年9月8日 20,539 https://www.tornadoweb.org/
Dash MIT 2015年4月9日 16,428 https://dash.plotly.com/
Sanic MIT 2016年5月25日 16,097 https://sanic.dev/
AIOHTTP Apache 2.0 2013年10月1日 12,416 https://docs.aiohttp.org/
Falcon Apache 2.0 2012年12月6日 8,760 https://falcon.readthedocs.io/
Bottle MIT 2009年6月30日 7,603 https://bottlepy.org/
hug MIT 2015年7月16日 6,613 https://www.hug.rest/
Eve 独自ライセンス 2012年10月9日 6,467 https://docs.python-eve.org/
Pyramid ZPL v2.1 2008年7月4日 3,660 https://trypyramid.com/
web2py LGPL v3 2011年11月22日 1,989 http://web2py.com/
Masonite MIT 2017年12月20日 1,772 https://docs.masoniteproject.com/
CherryPy 三条項BSD 2004年11月20日 1,538 https://docs.cherrypy.dev/

様々な観点での分析

GitHubリポジトリーのStar数の推移

GitHubリポジトリーのStar数の推移を見てみましょう。

star_history.png

このグラフを見る限り、2013年まではDjango、Flask、Tornadoの3つの人気(GitHubのStar数という意味での)がほぼ同程度で推移していたことが分かります。その後、2014年あたりからTornadoが脱落し、DjangoとFlaskが抜きつ抜かれつで着実に人気を得ていたところに、2020年に新たな勢力であるFastAPIが急激に伸びてきた印象です。

GitHubリポジトリーのコミット数

過去5年間のGitHubリポジトリーのコミット数を見てみましょう。

commit_history.png

Djangoの開発が継続的に盛んであることが分かります。AIOHTTPやDashの開発も活発です。これらに比較すると、Bottleの開発は停滞しているように見えます。

直近1年に絞ると以下のようになります。

commit_history_1y.png

hugのコミット数が0です。調べてみると、2020年の8月を最後にコミットがありません。こんなチケットがあったので、さらに調べてみると、hugを開発した方がFastAPIに対して、「正直言って私がハグしたかったものだ」とコメントしているページが見つかりました。

"Honestly, what you've built looks super solid and polished. In many ways, it's what I wanted Hug to be - it's really inspiring to see someone build that."

Timothy Crosley - Hug creator (ref)

その点を考えると、hugは今後の開発やメンテナンスや継続しないのではないかと予想できます。

GitHubリポジトリーのコントリビューター数

現時点のGitHubリポジトリーのコントリビューター数は、以下のようになっています。

contributors.png

やはり、Djangoが多いですが、後発のAIOHTTPも比較的多いです。

コードの行数

ソースコードの行数の合計は、以下のようになっています。

loc.png

人気を二分しているDjangoとFlaskで、ここまで差があるというのは非常に興味深いところです。ポイントを押さえて最小限の機能に絞り込み、シンプルさを重視することで、開発規模が小さくてもOSSの評価が高くなることをFlaskは示しています。

ファイル数

nof.png

ファイル数はコードの行数とほぼ同様でしょうか。

ファイルの種類

noft.png

ファイルの種類は大きな差がありません。

ファイルの構成比率

各OSSを構成するファイルの実装言語の構成比率を見てみましょう。

cons_loc.png

ほとんどのOSSで多くの割合を占めているえんじ色の部分がPythonです。Python以外ではMarkdownやPO Fileの比率が高いものがありますが、これはガイドなどのドキュメントをプロジェクト内で管理しているものなので、これは除外して考えた方がいいでしょう。その観点で見ると、特徴的なのはDashです。Dashは他と比較してPythonの比率が高くなく、JSONやTypeScript、JavaScriptが多用されていることが分かります。これは、DashがFlask、Plotly.js、React.jsなどをベースにした機械学習によるデータの可視化を目的としたフレームワークであるからだと思います(つまり、用途を特化させることで、他のOSSよりもWebアプリケーションの完成形に近いため)。

プロジェクトのファイルサイズ

GitHubからダウンロードした時の圧縮ファイルのサイズは以下のようになります。

file_size.png

Google Searchの検索結果数(全言語)

search_result.png

インターネット上の情報量は、Django、Flask、Bottleなど歴史のあるフレームワークが多いです。Dashも多いようですが、「Dash」をOSS名として含まない(一般的な意味でdashを使っている)文章も多く含まれているかもしれません。

Google Searchの検索結果数(日本語)

search_result_jp.png

日本語の情報はDjangoとFlaskが多いです。

Google Trendsの結果

Google Trendsに「OSS名 python framework」のキーワードを追加して比較してみましょう。

スクリーンショット 2022-03-31 13.13.38.png

Djangoが常にトップの人気を維持していることが分かります。これと比較対象になるのはFlaskくらいでしょうか。

Snyk Advisorのスコア

GitHubプロジェクトの健全性を評価してみましょう。アプリケーションセキュリティ技術を開発するSnykが公開しているオンラインサービス「Snyk Advisor」を使用すると、GitHubプロジェクトの健全性を評価できます。健全性の総合的な評価値である「Package Health Score」は、主に、POPULARITY(人気度)、MAINTENANCE(メンテナンスの正常度)、SECURITY(セキュリティの強度)、COMMUNITY(コミュニティーの活性度)の4つを評価して100点満点でスコアリングしています。評価は、POPULARITYであればGitHubのStar数やダウンロード数など、MAINTENANCEであれば最近のリリース数やプルリクエストの対応状況などを対象としているようです。

OSS名 POPULARITY MAINTENANCE  SECURITY  COMMUNITY Health Score
Django 96
Flask 100
FastAPI 88
Tornado 87
Sanic 88
Dash 94
AIOHTTP 96
Falcon 97
Bottle 71
hug 57
Eve 66
Pyramid 76
web2py 44
Masonite 87
CherryPy 90

機能の比較

Webアプリケーションの主要な機能の実装状況で比較してみましょう。

OSS名 RDBMS
サポート
NoSQL
サポート
REST
サポート
管理
コンソール
テンプレート
エンジン
テスト
Django
Flask
FastAPI
Tornado
Sanic × ×
Dash × ×
AIOHTTP × ×
Falcon
Bottle
hug × × × ×
Eve × ×
Pyramid ×
web2py
Masonite × ×
CherryPy

〇:機能あり
△:プラグインやライブラリー、別OSSなどで実現可能
×:未対応

なお、ここでの〇、△、×は私が限られた時間内で調べたものであり、正確性については保証できません。バージョンによっても異なりますし、〇、△、×の境界が曖昧なものもありますので、注意して下さい。誤りがあればご指摘いただけると、うれしいです。

標準仕様への対応状況

標準仕様への対応状況で比較してみましょう。

OSS名 WSGI対応 ASGI対応 OIDC対応(※1) OAuth2対応(※2)
Django
Flask
FastAPI
Tornado ×
Dash × ×
Sanic ×
AIOHTTP ×
Falcon × ×
Bottle ×
hug × × ×
Eve × ×
Pyramid × ×
web2py × × ×
Masonite × × ×
CherryPy × × ×

〇:対応
△:プラグインやライブラリー、別OSSなどで対応可能
×:未対応

※1:OpenID Connect 1.0
※2:OAuth 2.0

なお、ここでの〇、△、×は私が限られた時間内で調べたものであり、正確性については保証できません。バージョンによっても異なりますし、〇、△、×の境界が曖昧なものもありますので、注意して下さい。誤りがあればご指摘いただけると、うれしいです。

導入事例

導入事例は以下の通りです。空白のものは導入事例が無いといわけではもちろんありません。調査した結果、見つけられなかったということです。

OSS名 導入事例
Django Instagram、Pinterest、Coursera、Udemy
Flask Netflix、Zillow、Lyft
FastAPI Uber、Netflix、Microsoft、Explosion AI
Tornado FriendFeed、Turntable.fm、Fantamaster.it
Dash LBKE, NLP, Alpiq AG
Sanic Herren, Bonton, AdCombo
AIOHTTP HENNGE、Uploadcare、BestDoctor
Falcon LinkedIn、Leadpages、Wargaming、Rackspace
Bottle Sotong Kitchen, Net Power & Light, Scommerce
hug Owlin
Eve Main
Pyramid Reddit、Yelp、Mozilla、SurveyMoney、NewCars.com
web2py Vidjil、Sarapis、StopStalk
Masonite
CherryPy Netflix、Hulu

簡単なWebアプリの開発と動作確認

現時点で特に人気の高い以下の3つのOSSをベースに、「Hello, World!」のレスポンスを返すだけの簡単なWebアプリケーションを実装し、起動してみましょう。

Django

インストール

$ pip install django

サンプルプロジェクトの作成

$ django-admin startproject hello_world
$ cd hello_world/

以下の内容でviews.pyを作成します。

from django.http import HttpResponse

def helloworld(request):

    return HttpResponse('<h1>Hello, World!</h1>')

urls.pyに以下の2行を追加します。

from django.contrib import admin
from django.urls import path
from hello_world import views # ←追加

urlpatterns = [
    path('admin/', admin.site.urls),
    path('hello/', views.helloworld), # ←追加
]

Webアプリケーションの起動

$ python manage.py runserver 8000

http://localhost:8000/hello/ にアクセスすると、以下のような画面が表示されます。

Screenshot 2022-05-24 17.00.54.png

Flask

インストール

$ pip install flask

アプリケーションの作成と起動

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello_world():
    return '<h1>Hello, World!</h1>'

app.run()

http://localhost:5000 にアクセスすると、以下のような画面が表示されます。

Screenshot 2022-05-24 17.01.29.png

FastAPI

インストール

$ pip install fastapi "uvicorn[standard]"

アプリケーションの作成と起動

以下の内容でmain.pyを作成します。FastAPIはデフォルトでHTMLではなく、JSONを返します。

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
async def root():
    return {"message": "Hello, World!"}
$ uvicorn main:app --reload

http://localhost:8000 にアクセスすると、以下のような画面が表示されます。

Screenshot 2022-05-24 16.52.22.png

Java出身の私から見ると、どれも簡単ですが、特にFlaskやFastAPIは簡単で素早く始められますね。

さいごに

多数あるOSSからどれを選ぶかは悩ましいところです。フロントエンド (ReactやVueなどのJavaScriptのフレームワーク)と通信するAPIを構築するようなモダンなWebアプリケーションであれば、新しいフレームワークであるFastAPIを第1候補にするのがいいのかなぁと思いました。FastAPIは、様々なフレームワークから多くのアイディアを得て開発されており、いま最も勢いがあるように見えます。従来型のWebアプリケーションを開発するのであれば、日本語の情報量が多いDjangoやFlaskが無難かもしれません。開発の規模が大きければ、フルスタックフレームワークのDjangoが、Webアプリケーションとして必要最小限な機能をベースにプラグインで機能追加しながら開発したいのであれば、Flaskがいいでしょうか。その上で、機械学習との機能連携などの特殊な要件がある場合は、それ以外のフレームワーク(Dashなど)も検討する価値は十分にあるように思いました。

各OSSを使用したWebアプリケーションの代表的な構成パターンとか、各OSSの習得難易度や性能の比較検証などもやってみたいところですが、とりあえず今回はここまでとします(需要がありそうなら考えます)。

参考資料

207
191
7

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
207
191

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?