FastAPI 抛出错误(错误加载 ASGI 应用程序。无法导入模块“api”)

Pok*_*tra 31 python fastapi uvicorn

我尝试使用 uvicorn 网络服务器运行 FastAPI,但它引发了错误。

我运行这个命令,

uvicorn api:app --reload --host 0.0.0.0

但是终端有错误。

Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
Started reloader process [23445]
Error loading ASGI app. Could not import module "api".
Stopping reloader process [23445]
Run Code Online (Sandbox Code Playgroud)

我真的很感激任何建议或建议

Yag*_*nci 69

TL; 博士

在文件名前添加目录名

uvicorn src.main:app 
Run Code Online (Sandbox Code Playgroud)

cd进入该目录

cd src
uvicorn main:app 
Run Code Online (Sandbox Code Playgroud)

长答案

发生这种情况是因为您与 FastAPI 应用程序实例不在同一文件夹中,更具体地说:

假设我有一个这样的应用程序树;

my_fastapi_app/
??? app.yaml
??? docker-compose.yml
??? src
?   ??? main.py
??? tests
    ??? test_xx.py
    ??? test_yy.py

$ pwd         # Present Working Directory
/home/yagiz/Desktop/my_fastapi_app
Run Code Online (Sandbox Code Playgroud)

我和我的应用程序实例不在同一个文件夹中,所以如果我尝试使用 uvicorn 运行我的应用程序,我会收到像你这样的错误

$ uvicorn main:app --reload
INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO:     Started reloader process [40645] using statreload
ERROR:    Error loading ASGI app. Could not import module "main".
Run Code Online (Sandbox Code Playgroud)

答案就这么简单,在你的文件名前加上文件夹名

uvicorn src.main:app --reload
Run Code Online (Sandbox Code Playgroud)

或者你可以改变你的工作目录

cd src 
Run Code Online (Sandbox Code Playgroud)

现在我在我的应用程序实例所在的文件夹中

src
??? main.py
Run Code Online (Sandbox Code Playgroud)

再次运行你的 uvicorn

$ uvicorn main:app --reload
INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO:     Started reloader process [40726] using statreload
INFO:     Started server process [40728]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
Run Code Online (Sandbox Code Playgroud)

  • 应用程序中还有另一个文件导入 main,错误消息与该导入相关,而不是我传递给 uvicorn 的 main,但由于没有堆栈跟踪,看起来 uvicorn 无法找到主模块。重新整理了代码,现在完美了 (6认同)
  • 我遇到这个问题是因为我错误地在命令中添加了“.py”,例如“uvicorn main.py:app”。它应该是`uvicorn main:app`。 (4认同)
  • 好吧,我与 main.py 文件位于同一文件夹中,但它不想运行 (3认同)
  • 嗨@Carlos3dx FastAPI 实例的名称是什么,它称为应用程序吗?例如,如果你声明像 `other_app = FastAPI()` 你需要作为 `main:other_app` 运行,如果它也不起作用,我可以从 FastAPI 的 [gitter](https://gitter.im/蒂安戈洛/fastapi) (2认同)
  • 另一个选项,uvicorn 有一个路径参数:--app-dir src。运行 uvicorn --help,显示所有选项 (2认同)

Fer*_*dox 16

发生这种情况的原因之一是您正在使用:

\n
uvicorn src/main:app --reload    \n
Run Code Online (Sandbox Code Playgroud)\n

而不是正确的语法

\n
uvicorn src.main:app --reload \n
Run Code Online (Sandbox Code Playgroud)\n

注意. 而不是/
\n当前终端中的自动完成提示格式错误。

\n
\n

假设:

\n

(1) 你的结构是这样的:

\n
project_folder/\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 some_folder\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 src\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 main.py\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 tests\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 test_xx.py\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 test_yy.py\n
Run Code Online (Sandbox Code Playgroud)\n

(2) 您的对象确实被分配给名为FastAPI()的对象:appmain.py

\n
app = FastAPI()\n
Run Code Online (Sandbox Code Playgroud)\n

(3) 您正在运行 uvicorn 命令project_folder,例如:

\n
(venv) <username>@<pcname>:~/PycharmProjects/project_folder$ uvicorn src.main:app --reload\n
Run Code Online (Sandbox Code Playgroud)\n


小智 7

我遇到了同样的问题并解决了在 main 之前添加包名的问题,在你的情况下尝试:

uvicorn src.main:app --reload
Run Code Online (Sandbox Code Playgroud)

可能会解决问题