uvicorn:

uvicorn 作为 FastAPI 框架的主流运行方式,在入门中,

通常使用命令 uvicorn main:app --reload 来运行我们的app程序

main:app 解释:

main: 运行文件的文件名,也即是说,如果我们的运行文件名为 main.py,就要使用 main:??? 来运行程序

app:我们声明的app名称,通常使用 app = FastAPI(),这样我们调用的时候就是用 main:app


常见问题:

uvicorn.run(app="main:app", host='0.0.0.0', port=8000, workers=2)
ERROR:    Error loading ASGI app. Could not import module "main".

使用 uvicorn.run( ) 来运行app的时候,发生了~~报错~~,经过验证,我们的文件名和app名称都没有问题,那问题出现在那里了呢?

解决办法

我在 FastAPI 的 github 中找到了解决办法:FastAPI BUG

在讨论中,部分人并不认为这是BUG,但在文末,我找到了想要的 答案

uvicorn.run(app=f'{Path(__file__).stem}:app', host='127.0.0.1', port=8000, reload=True, debug=True, workers=4)

没错,只是将文件名替换为了绝对路径,在头部导入Path包 from path import Path 来使用 Path

我们再尝试运行:

INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO:     Started reloader process [13412] using watchgod
INFO:     Started server process [9768]
INFO:     Waiting for application startup.
INFO:     Application startup complete.

成功了!

疑惑:

当我尝试将此方法再次换成文件名发现也是可以的了,但是当我终止程序,再次启动,又会报错

我的猜想是,在调用文件的途中,或者是运行文件的位置,python并没有完全识别到

我们知道,在运行python文件时,我们会经常在头部加入指定此py文件位置的代码以免python识别不到路径

看来,这是一个通病,或是python的路径特色

end