Подтвердить что ты не робот

Как настроить автозагрузку с помощью Flask + uWSGI?

Я ищу что-то вроде uWSGI + режим автозагрузки django для флешки.

4b9b3361

Ответ 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.