Функциональность автоматической перезагрузки Flask в режиме разработки фактически обеспечивается базовой библиотекой Werkzeug. Соответствующий код находится в werkzeug/serving.py
- это стоит посмотреть. Но в основном основное приложение порождает сервер WSGI как подпроцесс, который отслеживает каждый активный файл .py
раз в секунду в поисках изменений. Если он обнаруживает что-либо, подпроцесс завершается, и родительский процесс запускает его снова - фактически перезагружая чаги.
Нет причин, по которым вы не могли бы реализовать подобную технику на уровне uWSGI. Если вы не хотите использовать цикл stat, вы можете попробовать использовать команды ОС для просмотра файлов. Очевидно (согласно коду Werkzeug), pyinotify глючит, но, возможно, Watchdog работает? Попробуйте несколько вещей и посмотрите, что получится.
Edit:
В ответ на комментарий, я думаю, это будет довольно легко переопределить. Основываясь на примере, приведенном по вашей ссылке, вместе с кодом из werkzeug/serving.py
:
""" NOTE: _iter_module_files() and check_for_modifications() are both
copied from Werkzeug code. Include appropriate attribution if
actually used in a project. """
import uwsgi
from uwsgidecorators import timer
import sys
import os
def _iter_module_files():
for module in sys.modules.values():
filename = getattr(module, '__file__', None)
if filename:
old = None
while not os.path.isfile(filename):
old = filename
filename = os.path.dirname(filename)
if filename == old:
break
else:
if filename[-4:] in ('.pyc', '.pyo'):
filename = filename[:-1]
yield filename
@timer(3)
def check_for_modifications():
# Function-static variable... you could make this global, or whatever
mtimes = check_for_modifications.mtimes
for filename in _iter_module_files():
try:
mtime = os.stat(filename).st_mtime
except OSError:
continue
old_time = mtimes.get(filename)
if old_time is None:
mtimes[filename] = mtime
continue
elif mtime > old_time:
uwsgi.reload()
return
check_for_modifications.mtimes = {} # init static
Это не проверено, но должно работать.