Rechargement automatique de l'application Python Flask lors des changements de code

202

J'étudie comment développer une application web décente avec Python. Comme je ne veux pas que certaines structures de haut niveau me gênent, mon choix s'est porté sur le cadre léger de Flask . Le temps nous dira si c'était le bon choix.

Donc, maintenant, j'ai configuré un serveur Apache avec mod_wsgi, et mon site de test fonctionne bien. Cependant, je voudrais accélérer la routine de développement en faisant recharger automatiquement le site sur toutes les modifications apportées aux fichiers py ou de modèle que je fais. Je vois que toute modification dans le fichier .wsgi du site provoque le rechargement (même sans WSGIScriptReloading On dans le fichier de configuration apache), mais je dois encore le produire manuellement (c'est-à-dire, insérer un saut de ligne supplémentaire, enregistrer). Existe-t-il un moyen de provoquer le rechargement lorsque je modifie certains des fichiers py de l'application? Ou, je suis censé utiliser IDE qui actualise le fichier .wsgi pour moi?

Vendredi
la source

Réponses:

229

La méthode actuellement recommandée consiste à utiliser l' flaskutilitaire de ligne de commande.

https://flask.palletsprojects.com/en/1.1.x/quickstart/#debug-mode

Exemple:

$ export FLASK_APP=main.py
$ export FLASK_ENV=development
$ flask run

ou en une seule commande:

$ FLASK_APP=main.py FLASK_ENV=development flask run

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

Exemple:

$ FLASK_APP=main.py FLASK_ENV=development flask run --port 8080

Plus d'options sont disponibles avec:

$ flask run --help
Eyal Levin
la source
3
ou pyvenv en python3.5, flask runfonctionne également, car lorsque vous pip install flask, un fichier exécutable de flacon est également installé dans le venv/bin/dossier.
TonyTony
Il s'agit d'une solution simple qui peut être traduite en Docker à des fins de développement. On peut voir cette même solution ici .
Fonctionne bien normalement mais cela ne semble pas fonctionner sur Ubuntu avec du code sur une partition NTFS. Pas de problème avec le code mais flask ne semble pas reconnaître les changements dans cette configuration.
citynorman
211

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

app.run(debug=True)

Ou, depuis la coque:

$ export FLASK_DEBUG=1
$ flask run

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

codegeek
la source
6
Cela ne fonctionne que lorsque vous exécutez le site via le serveur de développement intégré. Mais pas lors de son exécution via wsgi, sur Apache. Et je n'insiste pas sur le fait que je dois vraiment l'exécuter sur Apache, alors peut-être que ce que vous suggérez est la bonne façon de le faire.
vendredi
4
correct. Dans un environnement de développement, le serveur intégré fonctionne très bien et vous n'avez pas besoin de réinventer la roue pour recharger l'application. Je vous conseille fortement d'utiliser le serveur intégré pour le développement. fins. Dans prod, de toute façon, vous ne voulez pas recharger automatiquement l'application à chaque changement de code.
codegeek
44

Dans des 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 actions suivantes:

app.run(debug=True)

ou

app.debug = True

Vous pouvez également utiliser un fichier de configuration distinct pour gérer toute votre configuration si vous en avez besoin. Par exemple, j'utilise 'settings.py' avec une option 'DEBUG = True'. L'importation de ce fichier est également 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 sur Apache + mod_wsgi pour quelques raisons de performances mais aussi pour les options de configuration. L' option touch-reload vous permet de spécifier un fichier / dossier qui amènera l'application uWSGI à recharger votre application flask nouvellement 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 maintenu par Supervisord - évidemment) a cette ligne quelque part:

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

J'espère que ça aide!

Ewan
la source
1
Merci pour le bon conseil. Je l'ai simplifié un peu. Créez un script bash qui se touche lorsqu'il est exécuté. Ainsi, vous n'avez besoin de le lancer que lorsque vous souhaitez un rechargement. Ma solution: # touch_me_and_reload.sh touch $ 0
Jabba
@Ewan. où est censée se trouver la ligne de rechargement tactile? la section [programme: uwsig] ou la section [supervisord]?
user805981
@ user805981- ni, un .inifichier de configuration uwsgi distinct . Si vous lisez la documentation sur "touch-reload" c'est dans la configuration uWSGI, pas superviseur.
Ewan
Merci pour cela. app.run(debug=True)échoue, mais la définition de la variable d'environnement fonctionne.
Ari
23

Si vous utilisez uwsgi, regardez l'option de rechargement automatique de python:

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

site_root / __ init__.py

def register_debug_server():
    from werkzeug.debug import DebuggedApplication

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

Exécutez ensuite:

uwsgi --ini uwsgi-dev-example.ini

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

J'ai suivi cette voie pour imiter la production le plus près possible avec ma configuration nginx. Le simple fait d'exécuter l'application flask avec son serveur Web intégré derrière nginx entraînerait une erreur de passerelle incorrecte.

Kyle James Walker
la source
16

Quelques mises à jour pour Flask 1.0 et supérieur

l'approche de base du rechargement à chaud est la suivante:

$ export FLASK_APP=my_application
$ export FLASK_ENV=development
$ flask run
  • vous devez utiliser FLASK_ENV=development(pas FLASK_DEBUG=1)
  • comme contrôle de sécurité, vous pouvez exécuter flask run --debuggerjuste pour vous assurer qu'il est allumé
  • l'interface de ligne de commande Flask lira automatiquement des choses comme FLASK_APPet FLASK_ENVsi vous avez un .envfichier à la racine du projet et que python-dotenv est installé
Zach Valenta
la source
export FLASK_ENV=developmenttravaillé pour moi. app.run(debug=True)ne semble pas fonctionner.
alex
3

J'ai une idée différente:

Première:

pip install python-dotenv

Installez le python-dotenvmodule, qui lira les préférences locales pour votre environnement de projet.

Seconde:

Ajoutez un .flaskenvfichier dans le répertoire de votre projet. Ajoutez le code suivant:

FLASK_ENV=development

C'est fait!

Avec cette configuration pour votre projet Flask, lorsque vous exécutez flask runet vous verrez cette sortie dans votre terminal:

entrez la description de l'image ici

Et lorsque vous modifiez votre fichier, enregistrez simplement la modification. Vous verrez que le rechargement automatique est là pour vous:

entrez la description de l'image ici

Avec plus d'explications:

Bien sûr, vous pouvez frapper manuellement export FLASK_ENV=developmentchaque fois que vous en avez besoin. Mais utiliser un fichier de configuration différent pour gérer l'environnement de travail réel semble être une meilleure solution, donc je recommande fortement cette méthode que j'utilise.

Anthonyeef
la source
Parfait! n'oubliez pas non plus d'inclure la FLASK_APPvariable dans le .flaskenvfichier.
Cequiel
2

Les applications Flask peuvent éventuellement être exécutées en mode débogage. Dans ce mode, deux modules très pratiques du serveur de développement appelés le rechargeur et le débogueur sont activés par défaut. Lorsque le rechargeur est activé, Flask surveille tous les fichiers de code source de votre projet et redémarre automatiquement le serveur lorsque l'un des fichiers est modifié.

Par défaut, le mode de débogage est désactivé. Pour l'activer, définissez une FLASK_DEBUG=1variable d'environnement avant d'appeler le flacon run:

(venv) $ export FLASK_APP=hello.py for Windows use > set FLASK_APP=hello.py

(venv) $ export FLASK_DEBUG=1 for Windows use > set FLASK_DEBUG=1

(venv) $ flask run

* Serving Flask app "hello"
* Forcing debug mode on
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger PIN: 273-181-528

Avoir un serveur en cours d'exécution avec le rechargeur activé est extrêmement utile pendant le développement, car chaque fois que vous modifiez et enregistrez un fichier source, le serveur redémarre automatiquement et reprend la modification.

Asim Fakhi
la source
1

Pour y parvenir dans PyCharm, définissez la section «Variables d'environnement» sur:

PYTHONUNBUFFERED=1;
FLASK_DEBUG=1

Pour Flask 'run / debug configurations'.

ciel bleu
la source
Pour les utilisateurs de PyCharm Pro, vous pouvez configurer une configuration de débogage distincte
Ty Hitzeman
0

$ env: Flask_ENV = "MyAPP.py"

$ env: Flask_ENV = "développement"

course de flacon

Cela devrait être travaillé

LiQiang
la source
Il serait peut-être utile d'ajouter un peu plus de contexte à cette idée, par exemple quel est l'ensemble d'outils, le système d'exploitation hôte, etc.
Manfred