12

I'm attempting to get Uvicorn to automatically restart on detected file changes when launching programmatically, as it would when started from the command line with the --debug switch. The following statement is at the bottom of my api source code file and while Uvicorn starts and runs fine, it doesn't launch in reload mode. I've tried setting the debug parameter to various diffrent values: uvicorn.run(debug= 'true', 'True', 'yes' and True (python boolean), but nothing seems to work.

uvicorn.run(app,
            host=run_config['api_host'],
            port=run_config['api_port'],
            log_level=run_config['log_level'],
            debug='true')

EDIT: In reference to my comment on @howderek's answer: I've tried a modified version of the suggested code. While the server successfully starts, the code below doesn't turn on the reloader:

import uvicorn
from uvicorn.reloaders.statreload import StatReload
reloader = StatReload('debug')
reloader.run(uvicorn.run(app, host='localhost', port=9187, debug='true'))
Nathan Wailes
  • 9,872
  • 7
  • 57
  • 95
jpjenk
  • 459
  • 2
  • 8
  • 14

2 Answers2

17

The documentation states that you can just use reload=True.

Example:

uvicorn.run("example:app", port=5000, reload=True, access_log=False)
Joe
  • 6,758
  • 2
  • 26
  • 47
8

That is because the --debug flag does more than just set debug=True in the run function.

In the Uvicorn source it appears they are creating a StatReload which was imported from uvicorn.reloaders.statreload

I couldn't find any documentation regarding this feature, but it appears all you will need to do is take:

uvicorn.run(app,
    host=run_config['api_host'],
    port=run_config['api_port'],
    log_level=run_config['log_level'],
    debug='true')

and make it:

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'
})
howderek
  • 2,224
  • 14
  • 23
  • 1
    I'm pretty sure this is in the right direction but as written it doesn't quite work because uivicorn has no method get_logger (but StatReload itself does take a logger parameter). Also the asgi app name is not called. – jpjenk Oct 12 '18 at 19:22
  • 1
    Works perfectly just as written above in the edit. Many thanks!! – jpjenk Oct 13 '18 at 00:41