Я ищу что-то вроде uWSGI + режим автозагрузки django для флешки.
Как настроить автозагрузку с помощью Flask + uWSGI?
Ответ 1
Вы можете попробовать использовать supervisord в качестве менеджера для вашего Uwsgi-приложения. Он также имеет функцию часов, которая автоматически перезагружает процесс, когда файл или папка "коснулся" /изменен.
Здесь вы найдете хороший учебник: Flask + NginX + Uwsgi + Supervisord
Ответ 2
Я запускаю uwsgi версии 1.9.5 и вариант
uwsgi --py-autoreload 1
отлично работает
Ответ 3
В среде разработки вы можете попробовать использовать параметр -python-autoreload uwsgi. Рассматривая исходный код, он может работать только в потоковом режиме (--enable-threads).
Ответ 4
Функциональность автоматической перезагрузки флажка режима разработки фактически предоставляется базовой библиотекой Werkzeug. Соответствующий код находится в werkzeug/serving.py
- стоит посмотреть. Но в основном основное приложение запускает сервер WSGI в качестве подпроцесса, который обрабатывает каждый активный .py
файл один раз в секунду, ища изменения. Если он видит что-либо, подпроцесс завершается, и родительский процесс снова запускает его обратно - по сути перезагрузка chages.
Нет причин, по которым вы не могли бы реализовать подобную технику на уровне uWSGI. Если вы не хотите использовать цикл статистики, вы можете попробовать использовать основные команды OS-watch-watch. По-видимому (по коде 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
Он не тестировался, но должен работать.
Ответ 5
Если вы настраиваете uwsgi
с помощью аргументов команды, пройдите --py-autoreload=1
:
uwsgi --py-autoreload=1
Если вы используете файл .ini
для настройки uwsgi
и используете uwsgi --ini
, добавьте в свой файл .ini
следующее:
py-autoreload = 1
Ответ 6
import gevent.wsgi
import werkzeug.serving
@werkzeug.serving.run_with_reloader
def runServer():
gevent.wsgi.WSGIServer(('', 5000), app).serve_forever()
(Вы можете использовать любой сервер WSGI)
Ответ 7
Я боюсь, что Flask действительно слишком голые кости, чтобы иметь такую же реализацию, как в комплекте по умолчанию.
Динамически перезагружая код в производстве, как правило, плохо, но если вы обеспокоены средой dev, посмотрите на эту оболочку bash script http://aplawrence.com/Unixart/watchdir.html
Просто измените интервал ожидания на то, что соответствует вашим потребностям, и замените команду эха тем, что вы используете для перезагрузки uwsgi. Я запускаю uwsgi un master mode и просто отправляю команду killall uwsgi.