概要
2022年現在、Pythonで実装されたWebアプリケーションのフレームワークのOSSは多数あります。それらを様々な角度から比較してみましょう。
候補
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数の推移を見てみましょう。
このグラフを見る限り、2013年まではDjango、Flask、Tornadoの3つの人気(GitHubのStar数という意味での)がほぼ同程度で推移していたことが分かります。その後、2014年あたりからTornadoが脱落し、DjangoとFlaskが抜きつ抜かれつで着実に人気を得ていたところに、2020年に新たな勢力であるFastAPIが急激に伸びてきた印象です。
GitHubリポジトリーのコミット数
過去5年間のGitHubリポジトリーのコミット数を見てみましょう。
Djangoの開発が継続的に盛んであることが分かります。AIOHTTPやDashの開発も活発です。これらに比較すると、Bottleの開発は停滞しているように見えます。
直近1年に絞ると以下のようになります。
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リポジトリーのコントリビューター数は、以下のようになっています。
やはり、Djangoが多いですが、後発のAIOHTTPも比較的多いです。
コードの行数
ソースコードの行数の合計は、以下のようになっています。
人気を二分しているDjangoとFlaskで、ここまで差があるというのは非常に興味深いところです。ポイントを押さえて最小限の機能に絞り込み、シンプルさを重視することで、開発規模が小さくてもOSSの評価が高くなることをFlaskは示しています。
ファイル数
ファイル数はコードの行数とほぼ同様でしょうか。
ファイルの種類
ファイルの種類は大きな差がありません。
ファイルの構成比率
各OSSを構成するファイルの実装言語の構成比率を見てみましょう。
ほとんどのOSSで多くの割合を占めているえんじ色の部分がPythonです。Python以外ではMarkdownやPO Fileの比率が高いものがありますが、これはガイドなどのドキュメントをプロジェクト内で管理しているものなので、これは除外して考えた方がいいでしょう。その観点で見ると、特徴的なのはDashです。Dashは他と比較してPythonの比率が高くなく、JSONやTypeScript、JavaScriptが多用されていることが分かります。これは、DashがFlask、Plotly.js、React.jsなどをベースにした機械学習によるデータの可視化を目的としたフレームワークであるからだと思います(つまり、用途を特化させることで、他のOSSよりもWebアプリケーションの完成形に近いため)。
プロジェクトのファイルサイズ
GitHubからダウンロードした時の圧縮ファイルのサイズは以下のようになります。
Google Searchの検索結果数(全言語)
インターネット上の情報量は、Django、Flask、Bottleなど歴史のあるフレームワークが多いです。Dashも多いようですが、「Dash」をOSS名として含まない(一般的な意味でdashを使っている)文章も多く含まれているかもしれません。
Google Searchの検索結果数(日本語)
日本語の情報はDjangoとFlaskが多いです。
Google Trendsの結果
Google Trendsに「OSS名 python framework」のキーワードを追加して比較してみましょう。
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/ にアクセスすると、以下のような画面が表示されます。
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 にアクセスすると、以下のような画面が表示されます。
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 にアクセスすると、以下のような画面が表示されます。
Java出身の私から見ると、どれも簡単ですが、特にFlaskやFastAPIは簡単で素早く始められますね。
さいごに
多数あるOSSからどれを選ぶかは悩ましいところです。フロントエンド (ReactやVueなどのJavaScriptのフレームワーク)と通信するAPIを構築するようなモダンなWebアプリケーションであれば、新しいフレームワークであるFastAPIを第1候補にするのがいいのかなぁと思いました。FastAPIは、様々なフレームワークから多くのアイディアを得て開発されており、いま最も勢いがあるように見えます。従来型のWebアプリケーションを開発するのであれば、日本語の情報量が多いDjangoやFlaskが無難かもしれません。開発の規模が大きければ、フルスタックフレームワークのDjangoが、Webアプリケーションとして必要最小限な機能をベースにプラグインで機能追加しながら開発したいのであれば、Flaskがいいでしょうか。その上で、機械学習との機能連携などの特殊な要件がある場合は、それ以外のフレームワーク(Dashなど)も検討する価値は十分にあるように思いました。
各OSSを使用したWebアプリケーションの代表的な構成パターンとか、各OSSの習得難易度や性能の比較検証などもやってみたいところですが、とりあえず今回はここまでとします(需要がありそうなら考えます)。