55

我尝试使用 uvicorn webserver 运行 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]

我非常感谢任何建议或建议

4

9 回答 9

112

TL;博士

在文件名前添加目录名

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.
于 2020-07-16T12:25:50.923 回答
7

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

uvicorn src.main:app --reload

可以解决问题

于 2020-07-17T19:34:43.783 回答
2

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

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()对象确实被分配给名为appin的对象main.py

app = FastAPI()

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

(venv) <username>@<pcname>:~/PycharmProjects/project_folder$ uvicorn src.main:app --reload
于 2021-08-30T07:30:35.930 回答
2

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

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

于 2021-10-27T04:38:27.870 回答
0

它在“api”中的错字检查您的文件名。

于 2020-04-03T19:12:40.150 回答
0

这对我有用,请查看 fastAPI的文档。我非常感谢我遇到了这个问题,因为 Python 脚本不需要main.py命名app.py

命令uvicorn main:app指的是:

  1. main:文件main.py(Python“模块”)。
  2. app:main.py用线在里面创建的对象app = FastAPI()
  3. --reload:在代码更改后使服务器重新启动。仅用于开发。
于 2021-08-12T19:48:07.560 回答
0

点击 VS Code 等中的保存按钮,因为如果您没有保存文件,有时它会抛出此错误。发生在我身上。

于 2022-01-24T17:10:47.010 回答
0

将 FastAPI 的导入语句移到导入语句的顶部可修复错误。

from fastapi import FastAPI "然后是任何其他导入语句"

于 2022-01-31T20:18:32.080 回答
0

使用此文件夹结构和配置,其中 main 位于父目录中 在此处输入图像描述

启动.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
        }
    ]
}

主文件

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,
)
于 2022-02-25T19:47:31.890 回答