Проблема включения автоматического перезапуска Uvicorn при программном запуске с помощью uvicorn.run - PullRequest
0 голосов
/ 12 октября 2018

Я пытаюсь заставить Uvicorn автоматически перезапускаться при обнаруженных изменениях файлов при программном запуске, как это было бы при запуске из командной строки с переключателем --debug.Следующее утверждение находится в нижней части моего файла исходного кода API, и хотя Uvicorn запускается и работает нормально, он не запускается в режиме перезагрузки.Я попытался установить для параметра отладки различные значения: uvicorn.run(debug= 'true', 'True', 'yes' и True (python boolean), но, похоже, ничего не работает.

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

EDIT: Что касается моего комментария к ответу @ howderek: я попробовал модифицированную версию предложенного кода.Пока сервер успешно запускается, приведенный ниже код не включает перегрузчик:

import uvicorn
from uvicorn.reloaders.statreload import StatReload
reloader = StatReload('debug')
reloader.run(uvicorn.run(app, host='localhost', port=9187, debug='true'))

1 Ответ

0 голосов
/ 12 октября 2018

Это потому, что флаг --debug делает больше, чем просто устанавливает debug=True в функции запуска.

В источнике Uvicorn кажется, что они создают 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'
})
...