🍰

FastAPI (PythonのAPI framework) をGunicornで動かした話

2021/02/12に公開

そもそもFastAPIとは

PythonのAPI frameworkです

公式ホームページはこちら
https://fastapi.tiangolo.com/ja/

公式から引用すると、下記の特徴があるそうです

高速: NodeJS や Go 並みのとても高いパフォーマンス (Starlette と Pydantic のおかげです)。 最も高速な Python フレームワークの一つです.
高速なコーディング: 開発速度を約 200%~300%向上させます。 *
少ないバグ: 開発者起因のヒューマンエラーを約 40%削減します。 *
直感的: 素晴らしいエディタのサポートや オートコンプリート。 デバッグ時間を削減します。
簡単: 簡単に利用、習得できるようにデザインされています。ドキュメントを読む時間を削減します。
短い: コードの重複を最小限にしています。各パラメータからの複数の機能。少ないバグ。
堅牢性: 自動対話ドキュメントを使用して、本番環境で使用できるコードを取得します。
Standards-based: API のオープンスタンダードに基づいており、完全に互換性があります: OpenAPI (以前は Swagger として知られていました) や JSON スキーマ.

個人的な印象としては、Flaskより使い勝手が良くて、Djangoよりも学習コストが少ない、そして何よりドキュメントを自動で作ってくれるということで、とても使いやすいです

本題 - なにをやりたいか?

FastAPIは、下記のようにuvicornを使用して起動できます

pip install uvicorn
uvicorn main:app --reload

何も考えずにこれを使っていたのですが、社内のメンバーから指摘がありました
「uvicornのマニュアルにこんなの記載がありますよ」

For production deployments we recommend using gunicorn with the uvicorn worker class.
本番デプロイメントでは、uvicornワーカークラスでgunicornを使用することをお勧めします。

gunicorn main:app -w 4 -k uvicorn.workers.UvicornWorker

https://www.uvicorn.org/#running-with-gunicorn

ということで、gunicornを導入を試みました

やったこと

gunicornのインストール

poetry add gunicorn

私はpythonのパッケージ管理にpoetryを使っているので上のコマンド使いましたが、
pipは普通に下記でいけると思います

pip install gunicorn

起動、そしてエラー

gunicorn main:app -w 4 -k uvicorn.workers.UvicornWorker
ModuleNotFoundError: No module named 'uvloop'

エラーになりました。uvloopが存在しないらしい

解決策

pyproject.toml のuvicornの項目を下記のように変更する

uvicorn = {extras = ["standard"], version = "^0.13.3"}

※versionは自分が使うversionにしてください。
変更後にuvicornを一度アンインストールして、poetry update で再インストール

pipでインストールする場合は

pip install uvicorn[standard]

[standard] をつけないと最小限のモジュールしかインストールされないので、uvloopがなくてエラーになるようです

参考にしました:
https://github.com/tiangolo/fastapi/issues/2181

改めて起動

先ほどと同じ起動コマンドで、こんどこそ無事に起動しました

gunicorn main:app -w 4 -k uvicorn.workers.UvicornWorker

そもそも

FastAPIのドキュメントには、最初からstandard付きでインストールするように記載されていました

pip install uvicorn[standard]

https://fastapi.tiangolo.com/ja/#_3

結論

公式ドキュメントは、ちゃんと読もう

Discussion