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