Par défaut, lors de l'exécution de l'application Flask à l'aide du serveur intégré ( Flask.run
), il surveille ses fichiers Python et recharge automatiquement l'application si son code change:
* Detected change in '/home/xion/hello-world/app.py', reloading
* Restarting with reloader
Malheureusement, cela semble fonctionner uniquement pour les fichiers * .py , et je ne semble pas trouver de moyen d'étendre cette fonctionnalité à d'autres fichiers. Plus particulièrement, il serait extrêmement utile que Flask redémarre l'application lorsqu'un modèle change. J'ai perdu le compte du nombre de fois où j'ai joué avec le balisage dans les modèles et que je me suis trompé de ne voir aucun changement, pour découvrir que l'application utilisait toujours l'ancienne version du modèle Jinja.
Alors, y a-t-il un moyen d'avoir les fichiers de surveillance Flask dans le répertoire des modèles , ou faut-il plonger dans la source du framework?
Edit : J'utilise Ubuntu 10.10. Je n'ai vraiment essayé cela sur aucune autre plate-forme.
Après une enquête plus approfondie, j'ai découvert que les modifications apportées aux modèles sont effectivement mises à jour en temps réel, sans recharger l'application elle-même. Cependant, cela semble s'appliquer uniquement aux modèles passés à flask.render_template
.
Mais il se trouve que dans mon application, j'ai pas mal de composants réutilisables et paramétrés que j'utilise dans les modèles Jinja. Ils sont implémentés en tant que {% macro %}
s, résident dans des "modules" dédiés et sont {% import %}
édités dans des pages réelles. Tout est agréable et SEC ... sauf que ces modèles importés ne sont apparemment jamais vérifiés pour les modifications, car ils ne passent pas render_template
du tout.
(Curieusement, cela ne se produit pas pour les modèles appelés via {% extends %}
. Quant à {% include %}
moi, je n'en ai aucune idée car je ne les utilise pas vraiment.)
Donc, pour conclure, les racines de ce phénomène semblent se situer quelque part entre Jinja et Flask ou Werkzeug. Je suppose que cela peut justifier un voyage au bug tracker pour l'un ou l'autre de ces projets :) En attendant, j'ai accepté le jd. La réponse parce que c'est la solution que j'ai réellement utilisée - et cela fonctionne comme un charme.
Réponses:
D'après mon expérience, les modèles n'ont même pas besoin de redémarrer l'application pour être actualisés, car ils doivent être chargés à partir du disque à chaque
render_template()
appel. Peut-être que vos modèles sont utilisés différemment.Pour recharger votre application lorsque les modèles changent (ou tout autre fichier), vous pouvez passer l'
extra_files
argument àFlask().run()
, une collection de noms de fichiers à surveiller: toute modification sur ces fichiers déclenchera le rechargement.Exemple:
Voir ici: http://werkzeug.pocoo.org/docs/0.10/serving/?highlight=run_simple#werkzeug.serving.run_simple
la source
Flask.run
qui mène à la documentation Werkzeug. Mais cette option particulière semble suffisamment utile pour au moins l'avoir mentionnée dans la documentation Flask.No such file or directory
, essayez d'utiliser le chemin relatif comme dans:extra_dirs = ['./directory/to/watch',]
path
c'est, c'estos.path
. pensait que cela valait la peine d'être mentionnéflask run
partir de la ligne de commande?vous pouvez utiliser
Depuis http://flask.pocoo.org/docs/1.0/config/
la source
app.config['TEMPLATES_AUTO_RELOAD'] = True
, et pour une raison quelconque, m'attendais à voir le serveur redémarrer automatiquement lorsqu'un modèle changeait, comme il le fait en mode débogage. Il ne redémarre pas, mais il met à jour le modèle qu'il rend.Lorsque vous travaillez avec des
jinja
modèles, vous devez définir certains paramètres. Dans mon cas avec python3, je l'ai résolu avec le code suivant:la source
Pour moi fonctionne très bien:
En savoir plus sur http://flask.pocoo.org/docs/1.0/config/
la source
En fait pour moi
TEMPLATES_AUTO_RELOAD = True
ne fonctionne pas (version 0.12). J'utilise jinja2 et ce que j'ai fait:Créer une fonction
before_request
Enregistrez-le dans l'application
C'est tout.
la source
Ce qui a fonctionné pour moi, c'est simplement d'ajouter ceci:
( tiré de la réponse de @ dikkini )
la source
Utilisation de la dernière version de Flask sur Windows, en utilisant la commande run et le débogage défini sur true; Flask n'a pas besoin d'être réinitialisé pour que les modifications apportées aux modèles prennent effet. Essayez Shift + F5 (ou Shift plus le bouton de rechargement) pour vous assurer que rien n'est mis en cache.
la source
Voir http://flask.pocoo.org/docs/1.0/quickstart/ et utilisez
FLASK_ENV=development
la source
Mis à jour en juin 2019:
La CLI flask est recommandée sur app.run () pour exécuter un serveur de développement, donc si nous voulons utiliser la CLI, la solution acceptée ne peut pas être utilisée.
L'utilisation de la version de développement de Flask (1.1) à ce jour nous permet de définir une variable d'environnement FLASK_RUN_EXTRA_FILES qui fait effectivement la même chose que la réponse acceptée.
Voir ce problème github .
Exemple d'utilisation:
sous Linux. Pour spécifier plusieurs fichiers supplémentaires, séparez les chemins de fichiers par des deux points. , par exemple
La CLI prend également en charge un
--extra-files
argument à partir de Flask 1.1.la source
Les modèles sont rechargés automatiquement, pourquoi ne
ctrl+f5
pas actualiser la page Web, car les navigateurs Web enregistrent généralement le cache.la source