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

Posted

技术标签:

【中文标题】FastAPI 抛出错误(加载 ASGI 应用程序时出错。无法导入模块“api”)【英文标题】:FastAPI throws an error (Error loading ASGI app. Could not import module "api") 【发布时间】:2020-07-04 06:13:45 【问题描述】:

我尝试使用 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]

非常感谢任何建议或建议

【问题讨论】:

声明app变量的python文件的路径是什么? 在我的例子中,我的文件名是 uvicorn.pyuvicorn uvicorn:app 抛出错误。 【参考方案1】:

TL;DR

在你的文件名前加上目录名

uvicorn src.main:app 

cd 进入该目录

cd src
uvicorn main:app 

长答案

发生这种情况是因为您与您的 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

我与我的应用实例不在同一个文件夹中,所以如果我尝试使用 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".

答案很简单,在你的文件名前加上文件夹名

uvicorn src.main:app --reload

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

cd src 

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

src
└── main.py

再次运行你的 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.

【讨论】:

好吧,我和我的 main.py 文件在同一个文件夹中,但它不想运行 嗨@Carlos3dx FastAPI 实例的名称是什么?它叫应用程序吗?例如,如果您声明为 other_app = FastAPI(),则需要以 main:other_app 的身份运行,如果它也不起作用,我可以通过 FastAPI 的 gitter 为您提供帮助 应用程序中有另一个文件正在导入 main,错误消息与该导入有关,而不是我传递给 uvicorn 的 main,但由于没有堆栈跟踪,看起来 uvicorn 无法找到主模块。重新排列代码,现在可以完美运行【参考方案2】:

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

uvicorn src.main:app --reload

可以解决问题

【讨论】:

【参考方案3】:

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

uvicorn src/main:app --reload    

而不是正确的语法

uvicorn src.main:app --reload 

注意 . 而不是 /


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

project_folder/
├── some_folder
├── src
│   └── main.py
└── tests
    ├── test_xx.py
    └── test_yy.py

(2) 您的FastAPI() 对象确实分配给main.py 中名为app 的对象:

app = FastAPI()

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

(venv) <username>@<pcname>:~/PycharmProjects/project_folder$ uvicorn src.main:app --reload

【讨论】:

【参考方案4】:

将文件命名为 main.py 似乎很重要,否则它将不起作用。

编辑:实际上我在端口 8888 上运行 Jupyter Notebook,因此该端口已被占用。如果一定要运行 Jupyter notebook,请在运行 API server 后运行,notebook 会自动运行在 8889 上。 或者,您可以在不同的端口上运行 API 服务器。

【讨论】:

【参考方案5】:

“api”中的拼写错误检查您的文件名。

【讨论】:

【参考方案6】:

这对我有用 look at the docs 用于 fastAPI。我非常感谢我遇到了这个问题,因为 Python 脚本需要命名为 main.py 而不是 app.py

命令uvicorn main:app指的是:

    main:文件main.py(Python“模块”)。 app:在main.py 内部创建的对象,带有app = FastAPI()--reload:修改代码后让服务器重启。仅用于 发展。

【讨论】:

以上是关于FastAPI 抛出错误(加载 ASGI 应用程序时出错。无法导入模块“api”)的主要内容,如果未能解决你的问题,请参考以下文章

FastAPI 1:安装FastAPI

搭建ASGI高性能web服务器FastAPI,python

搭建ASGI高性能web服务器FastAPI,python

ASGI“寿命”协议似乎不受支持

错误:-“详细信息”:“未找到”将 Fastapi 与 Azure 函数应用一起使用

fastapi异步web框架入门