我试图让 Uvicorn 在以编程方式启动时自动重启检测到的文件更改,就像从命令行启动时使用 --debug
开关一样。以下语句位于我的 api 源代码文件的底部,虽然 Uvicorn 启动并运行良好,但它不会在重新加载模式下启动。我尝试将调试参数设置为各种不同的值:uvicorn.run(debug=
'true'、'True'、'yes' 和 True(python bool 值),但似乎没有任何效果。
uvicorn.run(app,
host=run_config['api_host'],
port=run_config['api_port'],
log_level=run_config['log_level'],
debug='true')
编辑:引用我对@howderek 的回答的评论:我尝试了建议代码的修改版本。当服务器成功启动时,下面的代码不会打开重新加载器:
import uvicorn
from uvicorn.reloaders.statreload import StatReload
reloader = StatReload('debug')
reloader.run(uvicorn.run(app, host='localhost', port=9187, debug='true'))
最佳答案
那是因为 --debug 标志不仅仅在 run 函数中设置 debug=True
。
在 Uvicorn source 中,他们似乎正在创建一个从 StatReload
导入的 uvicorn.reloaders.statreload
我找不到有关此功能的任何文档,但似乎您需要做的就是:
uvicorn.run(app,
host=run_config['api_host'],
port=run_config['api_port'],
log_level=run_config['log_level'],
debug='true')
并使它:
from uvicorn.reloaders.statreload import StatReload
from uvicorn.main import run, get_logger
reloader = StatReload(get_logger(run_config['log_level']))
reloader.run(run, {
'app': app,
'host': run_config['api_host'],
'port': run_config['api_port'],
'log_level': run_config['log_level'],
'debug': 'true'
})