PythonのWebフレームワークはいろいろありすぎて何を選べば良いかすごく迷いますね。
 
私はFlaskを2,3年使っていますが、最近FastAPIという素晴らしいものが出てきたのでこれを機に調べて見ました。
 
今回は、Pythonの有名なWebフレームワークのみを集めています。
対象は以下です。
  • 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というのが表示されるサイトを見つけたのでそちらで測定してみます。

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を学んでみてください。