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指的是:

  1. main:文件 main.py(Python“模块”)。
  2. app:在 main.py 中使用行 app = FastAPI()
  3. 创建的对象
  4. --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,
)