🍣

ryeとfastAPI (というかWSGI/ASGIアプリケーション)

2024/05/21に公開

FastAPI等のASGIフレームワークやWSGIフレームワークを使ってアプリケーションを作ったとき、uvicorn等のASGI/WSGIサーバを必要とすることがある。

このとき依存性管理で少し悩むことになる。
アプリケーションはFastAPIに依存しているが、uvicornには依存していない。よって、rye add uvicorn とするべきではない。
しかし「動くアプリケーションの構成」を記録しておきたいなら、なんらかの方法でlockファイルには含めておきたい。

このとき、ryeでは「ワークスペース」を使うのがよいと思う。
https://rye-up.com/guide/workspaces/
例えばpyproject.tomlに以下のように記述する。

pyproject.toml
[tool.rye.workspace]
members = ["launcher"]

そして以下のようにサブプロジェクトを作る。

rye init --script --no-readme --private launcher
cd launcher
rye add uvicorn

これによりルートプロジェクトの依存にuvicornを加えずに、lockファイルには加えたことになる。
このままrye run uvicorn yourmodname:appでもよいし、launcher.main()を以下のようにするのもよい。

launcher/__init__.py
def main() -> int:
    uvicorn.run("yourmodname:app")
    return 0

こうするとrye run launcherで起動できる。

Discussion