Comment configurer autoreload avec Flask+uWSGI?

je cherche quelque chose comme uWSGI + django autoreload mode pour Flacon.

24
demandé sur Florian 2012-01-12 11:59:16

7 réponses

vous pouvez essayer d'utiliser supervisord comme gestionnaire pour votre application Uwsgi. Il dispose également d'une fonction de veille qui recharge automatiquement un processus lorsqu'un fichier ou un dossier a été "touché"/modifié.

Vous trouverez un tutorial ici: Fiole+NginX+Uwsgi+Supervisord

9
répondu verrochio 2012-05-24 17:04:11

j'exécute uwsgi version 1.9.5 et l'option

uwsgi --py-autoreload 1

fonctionne très bien

46
répondu srossross 2013-04-07 16:50:29

Pour l'environnement de développement, vous pouvez essayer d'utiliser -- paramètre de python-autoreload uwsgi. En regardant le code source, il ne peut fonctionner qu'en mode threadé (--enable-threads).

13
répondu Tagar 2012-12-03 19:16:57

si vous configurez uwsgi avec les arguments de commande, passez --py-autoreload=1:

uwsgi --py-autoreload=1

si vous utilisez un .ini fichier pour configurer uwsgi et en utilisant uwsgi --ini, ajouter ce qui suit à votre .ini fichier:

py-autoreload = 1
13
répondu Luke Taylor 2017-01-08 05:13:52

la fonctionnalité de rechargement automatique du flacon en mode de développement est en fait fournie par la bibliothèque sous-jacente de Werkzeug. Le code correspondant est en werkzeug/serving.py -- cela vaut la peine d'y jeter un coup d'oeil. Mais fondamentalement, l'application principale produit le serveur WSGI comme un sous-processus qui Stat chaque actif .py le fichier une fois par seconde, à la recherche de changements. S'il en voit un, le sous-processus sort, et le processus parent le redémarre -- en rechargeant les chages.

Il n'y a pas de raison vous ne pouvez pas mettre en œuvre une technique similaire à la couche d'uWSGI. Si vous ne voulez pas utiliser une boucle stat, vous pouvez essayer d'utiliser les commandes de surveillance de fichiers OS sous-jacentes. Apparemment (selon le code de Werkzeug), pyinotify est buggy, mais peut-être Surveillance fonctionne? Essayez quelques trucs et voyez ce qui se passe.

Edit:

en réponse au commentaire, je pense que ce serait assez facile à réimposer. S'inspirant de l'exemple fourni à partir de votre lien avec le code de 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

ce n'est pas testé, mais ça devrait marcher.

5
répondu twooster 2012-01-16 00:00:55
import gevent.wsgi
import werkzeug.serving

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

(Vous pouvez utiliser un serveur WSGI arbitraire)

-1
répondu nisc 2012-01-13 00:20:12

j'ai bien peur que Flask soit vraiment trop dénudé pour avoir une implémentation comme celle-ci empaquetée par défaut.

recharger dynamiquement le code en production est généralement une mauvaise chose, mais si vous êtes préoccupé par un environnement dev, jetez un oeil à ce script bash shell http://aplawrence.com/Unixart/watchdir.html

il suffit de changer l'intervalle de sommeil en fonction de vos besoins et de remplacer la commande echo par tout ce que vous utilisez pour recharger uwsgi. - Je exécuter uWSGI un master mode et il suffit d'envoyer une commande killall uwsgi.

-3
répondu Artis 2012-01-12 08:42:01