使用uvicorn.run以编程方式启动时,启用Uvicorn自动重新启动时出现问题

时间:2018-10-12 18:05:07

标签: api wsgi

我正在尝试让Uvicorn以编程方式启动时,在检测到的文件更改后自动重新启动,就像通过命令行使用--debug开关启动时一样。以下语句位于我的api源代码文件的底部,虽然Uvicorn启动并运行良好,但它不会在重新加载模式下启动。我尝试将debug参数设置为各种不同的值: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'))

2 个答案:

答案 0 :(得分:2)

这是因为--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'
})

答案 1 :(得分:2)

documentation 声明您只能使用 reload=True

示例:

uvicorn.run("example:app", port=5000, reload=True, access_log=False)