133 votes

Recharger l'application Flask lorsque le fichier de template est modifié

Par défaut, lors de l'exécution d'une application Flask à l'aide du serveur intégré ( Flask.run ), il surveille ses fichiers Python et recharge automatiquement l'application si son code est modifié :

* Detected change in '/home/xion/hello-world/app.py', reloading
* Restarting with reloader

Malheureusement, cela semble fonctionner pour *.py et je n'ai pas trouvé 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 fichier modèle changements. J'ai perdu le compte du nombre de fois où j'ai manipulé des balises dans des modèles et où j'ai été confus de ne voir aucun changement, pour finalement découvrir que l'application utilisait toujours l'ancienne version du modèle Jinja.

Existe-t-il donc un moyen de faire en sorte que Flask surveille les fichiers dans modèles ou faut-il plonger dans les sources du framework ?

Editer : J'utilise Ubuntu 10.10. Je n'ai pas vraiment essayé sur d'autres plateformes.


Après une enquête plus approfondie, j'ai découvert que les modifications apportées aux modèles sont en effet sont mis à jour en temps réel, sans avoir à recharger l'application elle-même. Cependant, cela ne semble s'appliquer qu'aux modèles qui sont passés à la fonction 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 %} ées en pages réelles. Tout cela est très bien, mais les modèles importés ne sont apparemment jamais vérifiés pour des modifications, puisqu'ils ne passent pas par l'option render_template du tout.

(Curieusement, cela ne se produit pas pour les modèles invoqués par l'intermédiaire de {% extends %} . Quant à {% include %} Je n'en ai aucune idée car je ne les utilise pas vraiment.)

Pour conclure, les racines de ce phénomène semblent se situer quelque part entre Jinja et Flask ou Werkzeug. Je pense que cela peut justifier un voyage dans le bug tracker de l'un ou l'autre de ces projets :) En attendant, j'ai accepté le jd. car c'est la solution que j'ai utilisée - et elle fonctionne à merveille.

204voto

Loris Points 1638

Vous pouvez utiliser

TEMPLATES_AUTO_RELOAD = True

De http://flask.pocoo.org/docs/1.0/config/

Vérifier si la source du modèle a été modifiée et la recharger automatiquement. Par défaut, la valeur est None, ce qui signifie que Flask ne vérifie le fichier original qu'en mode débogage.

83voto

jd. Points 4600

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 fois. render_template() est appelé. Il est possible que vos modèles soient utilisés différemment.

Pour recharger votre application lorsque les modèles changent (ou tout autre fichier), vous pouvez passer l'option extra_files argument à Flask().run() une collection de noms de fichiers à surveiller : toute modification de ces fichiers déclenchera le rechargement.

Exemple :

from os import path, walk

extra_dirs = ['directory/to/watch',]
extra_files = extra_dirs[:]
for extra_dir in extra_dirs:
    for dirname, dirs, files in walk(extra_dir):
        for filename in files:
            filename = path.join(dirname, filename)
            if path.isfile(filename):
                extra_files.append(filename)
app.run(extra_files=extra_files)

Voir ici : http://werkzeug.pocoo.org/docs/0.10/serving/?highlight=run_simple#werkzeug.serving.run_simple

66voto

silgon Points 2646

Lorsque vous travaillez avec jinja vous devez définir certains paramètres. Dans mon cas avec python3, j'ai résolu le problème avec le code suivant :

if __name__ == '__main__':
    app.jinja_env.auto_reload = True
    app.config['TEMPLATES_AUTO_RELOAD'] = True
    app.run(debug=True, host='0.0.0.0')

39voto

Nikandr Marhal Points 451

Vous devez définir un TEMPLATES_AUTO_RELOAD comme True dans la configuration de votre application :

from flask import Flask

app = Flask(__name__)
app.config["TEMPLATES_AUTO_RELOAD"] = True

Voir plus sur http://flask.pocoo.org/docs/1.0/config/

12voto

dikkini Points 766

En fait, pour moi TEMPLATES_AUTO_RELOAD = True ne fonctionne pas (version 0.12). J'utilise jinja2 et ce que j'ai fait :

  1. Créer une fonction before_request

    def before_request():
        app.jinja_env.cache = {}
  2. L'enregistrer dans l'application

    app.before_request(before_request)
  3. C'est tout.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X