web-dev-qa-db-fra.com

Rechargement automatique python Flask app lors des modifications de code

Je cherche comment développer une application web décente avec Python. Puisque je ne veux pas que des structures de haut niveau se mettent en travers de mon chemin, mon choix s’est porté sur le poids léger cadre Flask . Le temps nous dira si c'était le bon choix.

J'ai donc configuré un serveur Apache avec mod_wsgi et mon site de test fonctionne correctement. Toutefois, j'aimerais accélérer la routine de développement en faisant en sorte que le site soit automatiquement rechargé à la suite de modifications apportées aux fichiers py ou modèles que je crée. Je constate que toute modification apportée au fichier .wsgi du site provoque le rechargement (même sans WSGIScriptReloading On dans le fichier de configuration Apache), mais je dois tout de même le modifier manuellement (c.-à-d. Insérer un saut de ligne supplémentaire, enregistrer). Existe-t-il un moyen de provoquer un rechargement lorsque je modifie certains fichiers py de l'application? Ou bien, je suis censé utiliser IDE pour actualiser le fichier .wsgi pour moi?

136
Passiday

La méthode actuellement recommandée (Flask> = 0.11) consiste à utiliser l'utilitaire de ligne de commande flask.

http://flask.pocoo.org/docs/0.11/server/

Exemple:

$ export FLASK_APP=main.py
$ export FLASK_DEBUG=1
$ python -m flask run

ou en une commande:

$ FLASK_APP=main.py FLASK_DEBUG=1 python -m flask run

Je préfère python -m flask run plutôt que flask run car le premier fonctionne également avec virtualenv.

Si vous voulez un port différent de celui par défaut (5000), ajoutez l'option --port.

Exemple:

$ python -m flask run --port 8080

Plus d'options sont disponibles avec:

$ python -m flask run --help
138
Eyal Levin

Si vous parlez d'environnements test/dev, utilisez simplement l'option de débogage. Il rechargera automatiquement l'application flask lorsqu'un changement de code se produira.

app.run(debug=True)

Ou, de la coquille:

$ export FLASK_DEBUG=1
$ flask run

http://flask.pocoo.org/docs/quickstart/#debug-mode

176
codegeek

En environnements de test/développement

Le débogueur werkzeug dispose déjà d'une fonction de "rechargement automatique" qui peut être activée en effectuant l'une des opérations suivantes:

app.run(debug=True)

ou

app.debug = True

Vous pouvez également utiliser un fichier de configuration séparé pour gérer toute votre configuration si vous en avez besoin. Par exemple, j'utilise 'settings.py' avec l'option 'DEBUG = True'. Importer ce fichier est aussi facile;

app.config.from_object('application.settings')

Cependant, cela ne convient pas à un environnement de production.

Environnement de production

Personnellement, j’ai choisi Nginx + uWSGI plutôt qu’Apache + mod_wsgi pour quelques raisons de performances mais également pour les options de configuration. L'option touch-reload vous permet de spécifier un fichier/dossier qui obligera l'application uWSGI à recharger votre application flask récemment déployée.

Par exemple, votre script de mise à jour extrait vos dernières modifications et touche le fichier 'reload_me.txt'. Votre script ini uWSGI (qui est géré par Supervisord - à l’évidence) contient cette ligne quelque part:

touch-reload = '/opt/virtual_environments/application/reload_me.txt'

J'espère que ça aide!

38
Ewan

Si vous utilisez uwsgi, consultez l’option python auto reload:

uwsgi --py-autoreload 1

Exemple uwsgi-dev-example.ini:

[uwsgi]
socket = 127.0.0.1:5000
master = true
virtualenv = /Users/xxxx/.virtualenvs/sites_env
chdir = /Users/xxx/site_root
module = site_module:register_debug_server()
callable = app
uid = myuser
chmod-socket = 660
log-date = true
workers = 1
py-autoreload = 1

racine_site/__ init__.py

def register_debug_server():
    from werkzeug.debug import DebuggedApplication

    app = Flask(__name__)
    app.debug = True
    app = DebuggedApplication(app, evalex=True)
    return app

Puis lancez:

uwsgi --ini uwsgi-dev-example.ini

Remarque: Cet exemple active également le débogueur.

J'ai choisi cette voie pour imiter le plus possible la production avec ma configuration nginx. Si vous exécutez simplement l'application flask avec son serveur Web intégré derrière nginx, cela entraînerait une erreur de passerelle incorrecte.

20

Quelques mises à jour pour Flask 1.0

l’approche de base pour le rechargement à chaud est la suivante:

_$ export FLASK_APP=my_application
$ export FLASK_ENV=development
$ flask run
_
  • vous devriez utiliser _FLASK_ENV=development_ (pas _FLASK_DEBUG=1_)
  • pour vérifier la sécurité, vous pouvez exécuter _flask run --debugger_ uniquement pour vous assurer qu'il est activé.
  • la CLI Flask lira automatiquement des éléments tels que _FLASK_APP_ et _FLASK_ENV_ si vous avez un fichier _.env_ à la racine du projet (en raison de une intégration avec python-dotenv )
  • voici un lien de travail vers la documentation (le lien de la réponse acceptée est cassé)
8
Zach Valenta

Pour cela, dans PyCharm, définissez la section 'Variables d'environnement' comme suit:

PYTHONUNBUFFERED = 1; FLASK_DEBUG = 1

Pour Flask 'configurations d'exécution/de débogage'

0
blue-sky