Как настроить автозагрузку с Flask + uWSGI? - PullRequest
26 голосов
/ 12 января 2012

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

Ответы [ 7 ]

51 голосов
/ 07 апреля 2013

Я использую UWSGI версии 1.9.5, и опция

uwsgi --py-autoreload 1

прекрасно работает

16 голосов
/ 08 января 2017

Если вы настраиваете uwsgi с аргументами команды, передайте --py-autoreload=1:

uwsgi --py-autoreload=1

Если вы используете файл .ini для настройки uwsgi и используете uwsgi --ini, добавьте в файл .ini следующее:

py-autoreload = 1
13 голосов
/ 03 декабря 2012

Для среды разработки вы можете попробовать использовать --python-autoreload параметр uwsgi. Глядя на исходный код, он может работать только в многопоточном режиме (--enable-threads).

10 голосов
/ 24 мая 2012

Вы можете попробовать использовать supervisord в качестве менеджера для вашего приложения Uwsgi.Он также имеет функцию наблюдения, которая автоматически перезагружает процесс, когда файл или папка были «затронуты» /modified.

Здесь вы найдете хороший учебник: Flask + NginX + Uwsgi + Supervisord

5 голосов
/ 12 января 2012

Функциональность автоматической перезагрузки 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

Это не проверено, но должно работать.

0 голосов
/ 13 января 2012
import gevent.wsgi
import werkzeug.serving

@werkzeug.serving.run_with_reloader
def runServer():
    gevent.wsgi.WSGIServer(('', 5000), app).serve_forever()

(Вы можете использовать произвольный сервер WSGI)

0 голосов
/ 12 января 2012

Я боюсь, что Flask действительно слишком прост для реализации подобной реализации по умолчанию.

Динамическая перезагрузка кода в производстве, как правило, плохо, но если вас беспокоит среда разработки,взгляните на этот скрипт оболочки bash http://aplawrence.com/Unixart/watchdir.html

Просто измените интервал ожидания на тот, который вам подходит, и замените команду echo на то, что вы используете для перезагрузки uwsgi.Я запускаю uwsgi un master mode и просто посылаю команду killall uwsgi.

...