FastAPI 抛出错误(加载 ASGI 应用程序时出错。无法导入模块 "api")
FastAPI throws an error (Error loading ASGI app. Could not import module "api")
我尝试使用 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]
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 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 之前添加包名称,在你的情况下尝试:
uvicorn src.main:app --reload
可能会解决问题
这对我有用 look at the docs fastAPI。我非常感谢我 运行 发现 Python 脚本需要命名为 main.py
而不是 app.py
命令uvicorn main:app
指的是:
main
:文件 main.py
(Python“模块”)。
app
:在 main.py
中使用行 app = FastAPI()
创建的对象
--reload
:修改代码后使服务器重启。仅用于
发展。
发生这种情况的一个原因是您正在使用:
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
看来为文件命名很重要 main.py 否则它将无法工作。
编辑:实际上我在端口 8888 上 运行ning Jupyter Notebook,因此该端口已被占用。如果你必须 运行 Jupyter 笔记本,运行 它在 运行 连接 API 服务器后,笔记本将自动 运行 在 8889 上。
或者,您可以 运行 API 服务器在不同的端口上。
在 VS Code 等中点击“保存”按钮,因为如果您尚未保存文件,有时它会抛出此错误。发生在我身上。
将 FastAPI 的导入语句移动到导入语句的顶部修复了错误。
from fastapi import FastAPI
# then any other import statement
使用此文件夹结构和配置,其中 main 位于父目录中
launch.json
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Python: FastAPI",
"type": "python",
"request": "launch",
"module": "uvicorn",
"args": [
"main:app"
],
"jinja": true
}
]
}
main.py
from fastapi import FastAPI
app = FastAPI(
title="test",
description="test",
version="0.0.1",
)
if __name__ == "__main__":
import uvicorn
uvicorn.run(
"main:app",
host="0.0.0.0",
reload=True,
port=3001,
)
我尝试使用 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]
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 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 之前添加包名称,在你的情况下尝试:
uvicorn src.main:app --reload
可能会解决问题
这对我有用 look at the docs fastAPI。我非常感谢我 运行 发现 Python 脚本需要命名为 main.py
而不是 app.py
命令uvicorn main:app
指的是:
main
:文件main.py
(Python“模块”)。app
:在main.py
中使用行app = FastAPI()
创建的对象
--reload
:修改代码后使服务器重启。仅用于 发展。
发生这种情况的一个原因是您正在使用:
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
看来为文件命名很重要 main.py 否则它将无法工作。
编辑:实际上我在端口 8888 上 运行ning Jupyter Notebook,因此该端口已被占用。如果你必须 运行 Jupyter 笔记本,运行 它在 运行 连接 API 服务器后,笔记本将自动 运行 在 8889 上。 或者,您可以 运行 API 服务器在不同的端口上。
在 VS Code 等中点击“保存”按钮,因为如果您尚未保存文件,有时它会抛出此错误。发生在我身上。
将 FastAPI 的导入语句移动到导入语句的顶部修复了错误。
from fastapi import FastAPI
# then any other import statement
使用此文件夹结构和配置,其中 main 位于父目录中
launch.json
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Python: FastAPI",
"type": "python",
"request": "launch",
"module": "uvicorn",
"args": [
"main:app"
],
"jinja": true
}
]
}
main.py
from fastapi import FastAPI
app = FastAPI(
title="test",
description="test",
version="0.0.1",
)
if __name__ == "__main__":
import uvicorn
uvicorn.run(
"main:app",
host="0.0.0.0",
reload=True,
port=3001,
)