web-dev-qa-db-fra.com

Comment configurer Autoreload avec Flack + UWSGI?

Je cherche quelque chose comme WSGI + Django Mode Autoreload pour la fiole.

31
Florian

Vous pouvez essayer d'utiliser Supervisord comme gestionnaire pour votre application UWSGI. Il a également une fonction de surveillance qui recharge automatique un processus lorsqu'un fichier ou un dossier a été "touché"/modifié.

Vous trouverez un bon tutoriel ici: Flacon + Nginx + UWSGI + Supervisord

10
verrochio

Je suis en cours d'exécution UWSGI version 1.9.5 et l'option

uwsgi --py-autoreload 1

fonctionne très bien

53
srossross

Si vous configurez uwsgi avec des 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, ajoutez ce qui suit à votre .ini déposer:

py-autoreload = 1
16
Luke Taylor

Pour l'environnement de développement, vous pouvez essayer d'utiliser le paramètre UWSGI --Python-Autoreload UWSGI. En regardant le code source, il ne peut fonctionner que dans le mode fileté (--en-threads).

13
Tagar

La fonctionnalité de rechargement automatique du mode de développement Flask est en fait fourni par la bibliothèque Werkzeug sous-jacente. Le code correspondant est en werkzeug/serving.py - ça vaut la peine de regarder regarder. Mais fondamentalement, l'application principale apparaît le serveur WSGI en tant que sous-processus que STATS chaque actif .py Fichier une fois par seconde, à la recherche de modifications. Si elle en voit, le sous-processus sortira et le processus parent le démarre à nouveau - en effet rechargeant les lèvres.

Il n'y a aucune raison que vous ne pouvez pas implémenter une technique similaire à la couche d'UWSGI. Si vous ne voulez pas utiliser une boucle de statistique, vous pouvez essayer d'utiliser des commandes de surveillance de fichiers OS sous-jacentes. Apparemment (selon le code de Werkzezug), Pyinotify est buggy, mais peut-être WatchDog fonctionne? Essayez quelques choses et voyez ce qui se passe.

Edit:

En réponse au commentaire, je pense que cela serait assez facile à réapparaître. Construire sur l'exemple fourni de votre lien, ainsi que 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

Il n'est pas testé, mais devrait travailler.

5
twooster