収録日:20201122
発表者:@atsumi
聞き手:@yohei_kikuta
内容:
- 最近、FastAPIのドキュメント翻訳をしています。
- きっかけは「代替ツールから受けたインスピレーションと比較」を読んだこと
- FastAPIの存在自体は認知していたが、これを読み過去のフレームワークからの学びやリスペクトが溢れていて読み物として面白かった。ちょうど翻訳プロジェクトが開始されたことを知ったので、翻訳してみた。
- その過程でFastAPIへの理解が深まり、次のデファクトになるポテンシャルを秘めた素晴らしいフレームワークだと感じた
- きっかけは「代替ツールから受けたインスピレーションと比較」を読んだこと
- FastAPIについて
- 個人的に感じる特徴は、高速・型ヒントのフル活用・APIのためのフレームワーク
- (1) 高速
- 公式では「NodeJSやGo並みに高速」とある
- TechEmpowerの結果をみるに、ちょっと劣ってはいそう
- とはいえ、例えばFlaskやDjangoと比べるとスコアは倍以上
- FastAPIが速さは、内部にあるStarletteとUvicornが速い
- Starlette
- "ASGI" アプリケーションのためのフレームワーク。
- ASGIとは
- Pythonで非同期ウェブサーバーを処理するためのインターフェース仕様
- 元々、WSGIというPEPがPythonにはある
- HTTPによる同期的アプリケーションのための共通インターフェース仕様
- 各FWは、これに則って開発をすることで、フレームワーク感で共通のインターフェースになるため、ミドルウェアを使いまわせる
- uwsgi + flask、uwsgi + pyramid、とか
- 各FWは、これに則って開発をすることで、フレームワーク感で共通のインターフェースになるため、ミドルウェアを使いまわせる
- HTTPによる同期的アプリケーションのための共通インターフェース仕様
- WSGIがカバーできていないWebsocketやasyncioなどの非同期処理をカバーするために作られた(PEPではない)
- ASGIはWSGIを内包している
- ASGIとは
- FastAPIは、いってしまえばStarletteをめちゃくちゃ使いやすくしたラッパー
- "ASGI" アプリケーションのためのフレームワーク。
- Uvicorn
- ASGIサーバー。Python実装だけど爆速。
- Uvicorn単体なら、「NodeJSやGo並み」と十分呼べそうなパフォーマンスを叩き出す。
- さらに詳しく見ると、uvloopとhttptoolsというライブラリが速い
- uvloop
- Python標準asyncioのイベントループ部分を置き換えるライブラリ
- libuv (NodeJSで利用されている) とCythonを利用して実装されている
- コミッターによると、echo serverのベンチマークでgolangと同等
- httptoolsを組み合わせると、golangを上回る結果も出る
- httptoolsはCython実装のHTTPパーサー
- uvloop
- Starlette
- 公式では「NodeJSやGo並みに高速」とある
- (2) 型ヒントのフル活用
- FastAPIは、Python3.6以上しかサポートしていない。つまり型ヒントあり
- Pydanticというスキーマバリデーションライブラリを利用している
- 型ヒントを使ってスキーマを定義する
- また、ResponseModelも型ヒントで指定すればその型に変換してくれたり。
- 利点
- IDE補完が効く
- Pycharmプラグインも開発されてる。
- 独自実装を覚える必要がない
- ドキュメント自動生成
- 入出力に型がついてるので、自動的にOpenAPIドキュメントを生成できる
- IDE補完が効く
- (3) APIのためのFW
- APIを作るために必要なものが全部ある
- Flask
- マイクロだが、結局バリデーションとか足りないので自分で実装するか外部ライブラリを持ってくることになる
- Django
- APIを作るにはFat。もともとAPIを作るためにデザインされたものではない
- FastAPI
- Flaskのような書き心地でAPIを書ける
- API開発に必要な足回りがだいたい揃っている
- バリデーションフレームワーク (Pydantic)
- OpenAPIドキュメント自動生成
- セキュリティ
- DBは含めていない。ただ、SQLAlchemyやpeeweeとどう統合させるかの詳細なガイドがある
- GraphQLやWebsocketといったアドンバンスな機能
- FlaskやDjangoと比べて非常に高速なパフォーマンス
- Flask
- APIを作るために必要なものが全部ある
- まとめ
- 型ヒントやASGIといった、現代の技術を積極的に取り込みつつ、Flaskのような簡便さも持っており、新規で始めるなら選択しない理由はないなという実感
- あえてあるなら、ASGI周辺のエコシステムはWSGIに比べると枯れてない(と思う)
- 翻訳対象はまだまだ残っているので、興味あればご参加を。結構気軽に参加できる雰囲気です。
- 補足
- StarletteにもOpenAPIスキーマ生成はありました:https://www.starlette.io/schemas/
参考情報:
- FastAPI:https://fastapi.tiangolo.com/
- 代替ツールから受けたインスピレーションと比較:https://fastapi.tiangolo.com/ja/alternatives/
- TechEmpowerベンチマーク:https://www.techempower.com/benchmarks/#section=data-r19&hw=ph&test=json&l=z8k16n-1r&a=2
- Starlette:https://www.starlette.io/
- Uvicorn:https://www.uvicorn.org/
- ASGI:https://asgi.readthedocs.io/en/latest/
- uvloop: Blazing fast Python networking:http://magic.io/blog/uvloop-blazing-fast-python-networking/
- Pydantic:https://pydantic-docs.helpmanual.io/
- FastAPIの日本語翻訳Issue:fastapi/fastapi#1572
- FastAPIで翻訳をはじめる際の公式ガイド:https://fastapi.tiangolo.com/contributing/#docs