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.py
和 uvicorn 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”)的主要内容,如果未能解决你的问题,请参考以下文章