目次
FastAPIでのuvicorn.run()からのアプリ起動とホットリロード設定について
FastAPIでpythonを動かしている際、コマンドラインからの起動ではなくuvicorn.run()から起動させていました。具体的には以下のコードを使用しています。
main.py
from fastapi import FastAPI
import uvicorn
app = FastAPI()
@app.get("/")
async def root():
return {"message": "app is running!"}
if __name__ == "__main__":
uvicorn.run(app)
このコードを実行すると、localhost:8000で"app is running!"というメッセージが返ってきます。
しかし、ホットリロードを追加しようとした際に以下のエラーが発生しました。
hot-reloadつきのコード
実際のコードは以下の通りです。
main.py
from fastapi import FastAPI
import uvicorn
app = FastAPI()
@app.get("/")
async def root():
return {"message": "app is running!"}
if __name__ == "__main__":
uvicorn.run(app, reload=True)
解決策
このエラーの原因は、reloadやworkersを利用する際にはアプリケーションをstringの値として渡す必要があるためです。
解決策としては、以下のようにstring形式で指定することで問題を解決できます。
main.py
from fastapi import FastAPI
import uvicorn
app = FastAPI()
@app.get("/")
async def root():
return {"message": "app is running!"}
if __name__ == "__main__":
uvicorn.run("main:app", reload=True)
これにより、ホットリロードを含めたuvicorn.run()でのアプリ起動が成功します。
参考