- Django
- Flask
- Bottle
- Tornado
- FastAPI
PythonのWebフレームワークはDjango, Pyramid, Tornado, Bottle, Flask, Falcon, graphene, websauna, sanic, Quart, responder, FastAPIなどなど、いろいろあるようです。
何がスタンダードなのというのもありますが、使うためには情報が無いと困るので、ぱっと調べて情報が出てこなかったものは除外しています。
この情報というのはドキュメントが充実しているか、チュートリアルが充実しているかというものではなく、例えばgoogleで「Python Webフレームワーク」と検索して出てきたものといった意味です。
簡単に言えば人気があるフレームワークと言えると思います。
そもそもここで出てきてくれないと選択肢に上がらないと思っていますので、どんなに素晴らしくても人気がでずに終わってしまったりすると思うんですよね。
目次
人気度
というわけで、早速人気度合いの比較から。
以下はGoogle Trendsです。(常套手段?)
見ていただくとわかると思いますが、Djangoが頭一つ抜けているのがわかります。
続いてBottleかFlaskか。
その後にTornadoかFastAPIかといったところでしょうか。
リポジトリ数
GitHubのリポジトリ数というのも、人気度のパラメーターになりそうです。
比較してみましょう。
GitHubでは「このページ(Advanced search)」を使います。
Advanced searchに以下の単語。
Written in this language に 「Python」を指定します。
Django | Flask | Bottle | Tornado | FastAPI |
227,377 | 102,654 | 2,233 | 4,534 |
1,721 |
Djangoが1位。2位がFlaskといったところですね。
FastAPIはおいといて、BottleとTornadoは人気がなさ過ぎる気が・・・。
Twitterでの人気度
人気があるフレームワークはTwitterでツイートされている気がしたので、人気度を測ってみました。
Twitterの人気度はどうやって測れば良いのかわかりませんが、Popularityというのが表示されるサイトを見つけたのでそちらで測定してみます。
Django | Flask | Bottle | Tornado | FastAPI |
52.5 | 46.2 | 52.5 | 62.5 |
11.9 |
FastAPIだけなんか異様に低いですね。
そういえば、FlaskとBottleとTornadoは一般的な単語でしたね。
TwitterでFlaskを検索してみたところ、料理の画像がくっついているツイートとかが出てきました。
これは参考にならないので忘れてしまいましょう。
誕生年
今度はそれぞれの年齢を確認してみます。
SWは個人的に年齢が長い方が成熟していて、若いほどバグが多い(偏見?)と思っているので、誕生年は重要な要素です。
Django | Flask | Bottle | Tornado | FastAPI |
2005年 | 2010年 | 2009年 | 2009年 |
2018年 |
それぞれ生まれた年は上記の通りです。
Djangoが最も古く、FastAPIが最も若いです。
バージョン履歴
誕生年と同じようにバージョン履歴も重要な指標ですよね。
それぞれのバージョンは以下の通りです。
Django | Flask | Bottle | Tornado | FastAPI |
3.1 | 1.1.2 | 0.12.18 | v6.0.4 | 0.61.1 |
数字が高いほど更新されているように見えますが、バージョン番号付けはルールがないに等しいのでよくわかりませんね。。。
tagの数
tagの数で比較してみましょう。
Django | Flask | Bottle | Tornado | FastAPI |
294 | 31 | 75 | 60 | 99 |
回数が多いほどコミュニティが活発で、頻繁にアップデートされていると言えます。
Djangoの更新回数がすごいのがよくわかりますね。
Flaskは少ないですね。バグが少ないという考え方もできるかもしれませんが、どうなんでしょうか。
ちなみに、年齢で割ってみたら活発度合いがもうちょっとわかるかもしれません。
tag数/年齢(2020-誕生年)
Django | Flask | Bottle | Tornado | FastAPI |
294/15 = 19.6 | 31/10 = 3.1 | 75/11 = 6.81... | 60/11 = 5.45... |
99/2 = 49.5 |
FastAPIの更新回数がおかしいことがわかります。
まだ2年しか経っていないにもかかわらず49.5回/年(しかも今は2020年9月!)の更新です。
FastAPIの最も古いタグ 0.1.11 のリリース日を確認したところ、 「released this on 16 Dec 2018」とありました。
2018/12/16ということは約9ヶ月しか経過していません!
年132回ペースの更新です!
素晴らしく活発だと言えると思います。コミュニティのやる気を感じられます!
時点でDjango。長くて人気があるものは強いです。
Flaskは年3回程度の更新しかないようですね。
それぞれのフレームワークのデータまとめ
Django | Flask | Bottle | tornado | FastAPI | ||
アイコン | (みあたらない) | ![]() |
![]() |
![]() |
![]() |
|
開始年 | 2005年 | 2010年 | 2009年 | 2009年 | 2018年 | |
GitHub | https://github.com/django/django | https://github.com/pallets/flask | https://github.com/bottlepy/bottle | https://github.com/tornadoweb/tornado | https://github.com/tiangolo/fastapi | |
Watch | 2.3k | 2.3k | 322 | 1.1k | 366 | |
Star | 51.8k | 51.9k | 7k | 19.4k | 20.6k | |
Fork | 22.4k | 13.7k | 1.3k | 5.2k | 1.4k | |
ライセンス | BSD 3-clause license | BSD 3-clause license | MIT License | Apache License | MIT License | |
公式サイト | https://www.djangoproject.com/ | https://palletsprojects.com/p/flask/ | http://bottlepy.org/docs/dev/ | https://www.tornadoweb.org/en/stable/ | https://fastapi.tiangolo.com/ | |
ドキュメント | https://docs.djangoproject.com/en/3.1/ | https://flask.palletsprojects.com/en/1.1.x/ | 同上 | 同上 | 同上 | |
Pythonバージョン | Django version | Python versions | 2.7 or 3.5以上 | 2.7 and Python3 | 3.5.2以上 | 3.6以上 |
1.11 | 2.7、3.4、3.5、3.6、3.7 (1.11.17 で追加) | |||||
2 | 3.4, 3.5, 3.6, 3.7 | |||||
2.1 | 3.5, 3.6, 3.7 | |||||
2.2 | 3.5、3.6、3.7、3.8 (2.2.8 で追加) | |||||
3.0,3.1 | 3.6, 3.7, 3.8 | |||||
依存関係 | Django==3.1.1 - asgiref [required: ~=3.2.10, installed: 3.2.10] - pytz [required: Any, installed: 2020.1] - sqlparse [required: >=0.2.2, installed: 0.3.1] |
Flask==1.1.2 - click [required: >=5.1, installed: 7.1.2] - itsdangerous [required: >=0.24, installed: 1.1.0] - Jinja2 [required: >=2.10.1, installed: 2.11.2] - MarkupSafe [required: >=0.23, installed: 1.1.1] - Werkzeug [required: >=0.15, installed: 1.0.1] |
標準ライブラリ以外無し | tornado==6.0.4 | fastapi==0.61.1 - pydantic [required: >=1.0.0,<2.0.0, installed: 1.6.1] - starlette [required: ==0.13.6, installed: 0.13.6] uvicorn==0.11.8 - click [required: ==7.*, installed: 7.1.2] - h11 [required: >=0.8,<0.10, installed: 0.9.0] - websockets [required: ==8.*, installed: 8.1] |
|
Template | Djangoテンプレート言語(DTL), Jinja2, カスタムテンプレート | jinja2 | builtin template engine, mako, jinja2,cheetah | 柔軟なテンプレート言語(組み込み。独自なのか不明) | なし。任意のテンプレートエンジンを利用可能。 | |
特徴 | フルスタック!(全部入り!) | マイクロフレームワーク! | 1ファイルで使える! | ロングポーリングやWebSocketを使うのにおすすめ! | ||
プラットフォーム | OS指定は見当たらず | OS指定は見当たらず | OS指定は見当たらず | LinuxかBSD | OS指定は見当たらず | |
インストール方法 | pip install Django | pip install Flask | pip install bottle | pip install tornado | pip install fastapi[all] |
実行速度は?
まとめた後に思い出しました!
Webページは早い方がいいらしいです。
表示されないWebページはすぐにブラウザバックしますし、必要な指標の様に見えます。
ほとんどアクセスがなければ、どれを使っても関係ない気がしますが、たくさんの人に使ってもらう(予定の)Webページを作るのに、そもそも遅いフレームワークを使っていたら悲しいことになるかもしれません。
実際にどれが早いのかは、全く同じページを作ってみるしかありませんが、世の中にはベンチマークが大好きな人がいて、定期的に計測してくれていたりします。
フレームワークにもベンチマークがないかなーと検索したところ、見つけました。
Performance (higher is better)と書いてあるので、数値が高いほどパフォーマンスが高いんじゃないかなと推測して値を確認してみましょう。
ページ内検索をしたところ、以下の通りになりました。
順位 | フレームワーク | スコア |
1 | FastAPI | 12,991 |
2 | Flask | 1,711 |
3 | bottle-pypy2 | 1,621 |
4 | Django | 1,491 |
5 | tornado-postgresql-raw | not complate |
FastAPIの早さが際立っています!
もうFastAPI一択でいいんじゃないでしょうか?
2-4位は横並び感。
tornadoは見つかりませんでした。
パフォーマンス測定してもらえないほどマイナーなんでしょうか・・・。
bottleはpypy2なので参考程度ですね。実際にはdjangoの方が早いのかもしれません。
どのフレームワークを選ぶべきか?
というわけで、いい加減どのフレームワークを選ぶか決めましょう。
フルスタックフレームワークが欲しい
Django一択です。
フルスタックはこれしかありません。
とりあえずなんでも入っているので、後から機能が足りないということは無いと思います。
1ファイルだけコピーすれば使えるのが良い
Bottleですね。
ファイルをコピーすれば使える手軽さが売りです。
若干ドキュメントが少ない気がしますが、そもそもファイルが1つなんだから動きがわからなかったらソースコード見れば良いのです。
ファイルのサイズもそれほど多くないですし、ずっとBottleを使っている人なら暗記してるんじゃないですかね。
早いのが欲しい
FastAPIです。
ベンチマークを見ていただければ納得いただけるかと。
また、FastAPIはASGIで動きます。
Djangoもそうですが、非同期通信に対応しているので早さという意味ではWSGIより早いのに納得できるでしょう。
難点があるとしたら、生まれてから間もないことですね。
生まれてから時間が経っていないということは、まだまだ発展途上と言うことです。
発展途上ならバグもあるでしょうし、機能も増えていくかもしれません。
大きく構文が変わるかもしれません。
ドキュメントはありますが、雄志のコードがなかなか見つからないかもしれません。(Qiitaとかね)
それを差し引いてもなかなか魅力があるフレームワークだと思います。
ロングポーリングやWebSocketを使いたい。
Tornadoです!と言いたいところですが、Django/Flask/FastAPIなら問題なくできると思います。
Tornadoはそもそもそのために設計されたようなので、バグがすくなさそうなのが魅力です。
とりあえず使い始めて拡張したい
Flaskですね。
Djangoは学習コストが重いのが特徴でもあるので、画面1枚に収まるコードで動かし始められるFlaskに軍配が上がります。
Flaskはフルスタックになれるほど豊富なライブラリがPyPIに転がっていますので、DBに接続したいならFlask-SQLAlchey、RESTAPIを作りたいならFlask-RESTFul、ログイン機能が作りたいFlask-Login、manage.pyみたいなのが作りたいFlask-Admin、WebScoketが使いたいFlask-WebSocket(Flask-uWSGI-WebScoket)のようにどんどん拡張していくことが可能です。
迷った、何かいいのない?
Flaskをおすすめします。
FastAPIはFlaskの後継なので、構文が似通っており、比較的容易に変更可能です。
学習コストも少なく、使えなくなってもダメージが少ないです。
また、少ないコストで必要最低限のMVC(MVVM)の知識を手に入れることができます。
ドキュメントも豊富で、雄志のソースコードもたくさん転がっています。
いいことづくめの言語と言えるでしょう。
そもそも私のおすすめはFlaskなのですが、FastAPIにすごい魅力を感じています。
また、FlaskでMVVMを学んだことで、他のフレームワーク(特にフルスタックと呼ばれるもの)を学びやすくなったと感じています。
現在はLaravelを学んでいますが、ドキュメント構成やソースコードの構成を先人が考えてくれているだけでやってることはFlaskと同じです。
FlaskはすべてのWebフレームワークで最も効率よくMVVM(MVC)を学べるフレームワークじゃないかと個人的には考えています。
とりあえず迷ったらFlaskを学んでみてください。