FastAPIでWARNING: You must pass the application as an import string to enable 'reload' or 'workers'.の対処法

公開日:
目次

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()でのアプリ起動が成功します。

参考