コンテンツにスキップ

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を使用する場合

uvicorn_with-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