使用 uvicorn.run 以编程方式启动时启用 Uvicorn 自动重启时出现问题
Problem enabling Uvicorn auto-restart when launching programmatically with uvicorn.run
我试图让 Uvicorn 在以编程方式启动时自动重启检测到的文件更改,就像使用 --debug
开关从命令行启动时一样。以下语句位于我的 api 源代码文件的底部,虽然 Uvicorn 启动并运行良好,但它不会在重新加载模式下启动。我尝试将调试参数设置为各种不同的值:uvicorn.run(debug=
'true'、'True'、'yes' 和 True(python 布尔值),但似乎没有工作。
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 标志不仅仅在 运行 函数中设置 debug=True
。
在 Uvicorn source 中,他们似乎正在创建一个从 uvicorn.reloaders.statreload
导入的 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'
})
documentation 指出您可以只使用 reload=True
。
示例:
uvicorn.run("example:app", port=5000, reload=True, access_log=False)
我试图让 Uvicorn 在以编程方式启动时自动重启检测到的文件更改,就像使用 --debug
开关从命令行启动时一样。以下语句位于我的 api 源代码文件的底部,虽然 Uvicorn 启动并运行良好,但它不会在重新加载模式下启动。我尝试将调试参数设置为各种不同的值:uvicorn.run(debug=
'true'、'True'、'yes' 和 True(python 布尔值),但似乎没有工作。
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 标志不仅仅在 运行 函数中设置 debug=True
。
在 Uvicorn source 中,他们似乎正在创建一个从 uvicorn.reloaders.statreload
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'
})
documentation 指出您可以只使用 reload=True
。
示例:
uvicorn.run("example:app", port=5000, reload=True, access_log=False)