Uvicorn@アプリケーション系ミドルウェア¶
はじめに¶
本サイトにつきまして、以下をご認識のほど宜しくお願いいたします。
01. Uvicornの仕組み¶
アーキテクチャ¶
ASDIプロトコルを使用したアプリケーション系ミドルウェアである。
02. 設計規約¶
開発環境でのUvicornの実行方法¶
▼ uvicornコマンドを使用する場合¶
アプリケーションのエントリーポイントをuvicorn
コマンドで指定する。
開発のしやすさから、開発環境ではUvicornを直接的に実行し、その時にreload
オプションを使用した方が良い。
FROM python:3.10-slim
...
CMD ["uvicorn", "main:app", "--reload", "--port", "8000"]
▼ uvicornパッケージのrun
関数を使用する場合¶
アプリケーションのエントリーポイントをpython
コマンドで直接的に指定する場合、Uvicornを実行できるように、uvicornパッケージのrun
関数をエントリーポイントで実行する。
ただし、他の.py
ファイルからエントリーポイントを読み込んだ場合 (from main import app
) に、Uvicornを再実行する必要はないため、『__name__ == "__main__"
』内にこれを実行する。
$ python main.py
import uvicorn
from src import create_app
app = create_app()
# 他の.pyファイルからUvicornを再実行しないようにする。
if __name__ == "__main__":
# または、uvicorn.run("main:app", host="0.0.0.0", port=8000)
uvicorn.run(app, host="0.0.0.0", port=8000)
本番環境でのUvicornの実行方法¶
▼ Gunicornを使用する場合¶
性能上の理由で、本番環境ではGunicornを使用してUvicornのプロセスを管理し、プロセスを間接的に実行した方が良い。
w
オプションを使用して、プロセスの並列数を設定できる。
FROM python:3.10-slim
...
CMD ["gunicorn", "main:app", "-w", "4", "-k", "uvicorn.workers.UvicornWorker", "--bind", "0.0.0.0:8000" ]
注意点として、Gunicornを使用する場合には、standardタイプのUvicornをインストールする必要がある。
$ pip3 install uvicorn[standard]
03. uvicornコマンド¶
ルートディレクトリにエントリーポイントのファイルを配置している場合は、<モジュール名>.<インスタンス名>
となる。
$ uvicorn main:app
もし、サブディレクトリ配下にこのファイルを配置している場合は、<ディレクトリ名>.<モジュール名>.<インスタンス名>
となる。
$ uvicorn src.main:app
--reload¶
▼ --reloadとは¶
ソースコードが変更された場合、再読み出しする。
$ uvicorn main:app --reload
--port¶
▼ --portとは¶
インバウンド通信を受け付けるポート番号を設定する。
$ uvicorn main:app --port 8000