web-dev-qa-db-fra.com

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

Par défaut, lors de l'exécution de l'application Flask à l'aide du serveur intégré (Flask.run), celle-ci 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 ne fonctionner que pour * .pyfichiers) et je ne trouve aucun moyen d'étendre cette fonctionnalité à d'autres fichiers. Il serait notamment extrêmement utile que Flask redémarre l'application lorsque a template changes J'ai perdu le compte du nombre de fois où j'ai tripoté le balisage dans les modèles et que j'ai été dérouté par le fait de ne voir aucun changement, seulement pour découvrir que l'application utilisait encore l'ancienne version du modèle Jinja.

Alors, y a-t-il un moyen d'avoir des fichiers de contrôle Flask dans le répertoire templates, ou faut-il plonger dans les sources du framework?

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


Après un complément d’information, j’ai découvert que les modifications apportées aux modèles sontsont mises à jour en temps réel, sans recharger l’application elle-même. Toutefois, cela semble s’appliquer uniquement aux modèles transmis à flask.render_template.

Mais il se trouve que dans mon application, j'ai beaucoup 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 %}ed dans des pages réelles. Tous Nice et DRY ... sauf que les modèles importés ne sont apparemment jamais vérifiés, car ils ne passent pas du tout par render_template.

(Curieusement, cela ne se produit pas pour les modèles invoqués via {% extends %}. En ce qui concerne {% include %}, je n'en ai aucune idée car je ne les utilise pas vraiment.)

En conclusion, les racines de ce phénomène semblent se situer quelque part entre Jinja et Flask ou Werkzeug. Je suppose que cela justifierait peut-être un déplacement dans l'outil de suivi des bogues pour l'un ou l'autre de ces projets :) En attendant, j'ai accepté la réponse de jd.Parce que c'est la solution que j'ai utilisée - et cela fonctionne à merveille.

58
Xion

D'après mon expérience, les modèles n'ont même pas besoin que l'application redémarre pour être régénérés, car ils doivent être chargés à partir du disque à chaque appel de render_template(). Peut-être que vos modèles sont utilisés différemment si.

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

Exemple:

from os import path

extra_dirs = ['directory/to/watch',]
extra_files = extra_dirs[:]
for extra_dir in extra_dirs:
    for dirname, dirs, files in os.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

48
jd.

vous pouvez utiliser

TEMPLATES_AUTO_RELOAD = True

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

S'il faut vérifier les modifications du modèle source et le recharger automatiquement. Par défaut, la valeur est None, ce qui signifie que Flask vérifie le fichier d'origine uniquement en mode débogage.

93
Loris

Lorsque vous travaillez avec des modèles jinja, vous devez définir certains paramètres. Dans mon cas avec python3, je l'ai résolu avec le code suivant:

if __== '__main__':
    app.jinja_env.auto_reload = True
    app.config['TEMPLATES_AUTO_RELOAD'] = True
    app.run(debug=True, Host='0.0.0.0')
35
silgon

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. Enregistrez-le en application

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

8
dikkini

Ce qui a fonctionné pour moi, c'est simplement d'ajouter ceci:

@app.before_request
def before_request():
    # When you import jinja2 macros, they get cached which is annoying for local
    # development, so wipe the cache every request.
    if 'localhost' in request.Host_url or '0.0.0.0' in request.Host_url:
        app.jinja_env.cache = {}

( extrait de la réponse de @ dikkini )

4
Garrett

En utilisant la dernière version de Flask sous Windows, en utilisant la commande run et le débogage définis sur true; Il n'est pas nécessaire de réinitialiser le flacon pour que les modifications apportées aux modèles soient prises en compte. Essayez les touches Maj + F5 (ou Maj plus le bouton de rechargement) pour vous assurer que rien ne se cache.

2
Drakekin

Pour moi, ça marche très bien: 

 from flask import Flask, render_template, request, url_for, redirect
 app = Flask(__name__)
 app.config["TEMPLATES_AUTO_RELOAD"] = True

Plus d'infos sur http://flask.pocoo.org/docs/1.0/config/

1
Nick Marhal

Mise à jour en juin 2019:

La fiole de la CLI est recommandée sur app.run () pour exécuter un serveur dev. Par conséquent, 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) à la date de rédaction de ce document nous permet de définir une variable d'environnement FLASK_RUN_EXTRA_FILES qui a effectivement le même effet que la réponse acceptée.

Voir ce numéro de github .

Exemple d'utilisation:

export FLASK_RUN_EXTRA_FILES="app/templates/index.html"
flask run

sous Linux. Pour spécifier plusieurs fichiers supplémentaires, séparez les chemins de fichiers par des deux points. , par exemple.

export FLASK_RUN_EXTRA_FILES="app/templates/index.html:app/templates/other.html"

La CLI prend également en charge un argument --extra-files à partir de Flask 1.1.

0
overseas

Voir http://flask.pocoo.org/docs/1.0/quickstart/ Et utilisez FLASK_ENV=development

0
Naxos84