Comment configurer autoreload avec Flask+uWSGI?
je cherche quelque chose comme uWSGI + django autoreload mode pour Flacon.
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
j'exécute uwsgi version 1.9.5 et l'option
uwsgi --py-autoreload 1
fonctionne très bien
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).
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
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.
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)
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.