webentwicklung-frage-antwort-db.com.de

Laden Sie die Flaschen-App erneut, wenn sich die Vorlagendatei ändert

Wenn Sie die Flask-Anwendung mit dem integrierten Server (Flask.run) ausführen, überwacht sie standardmäßig ihre Python-Dateien und lädt die App automatisch neu, wenn sich der Code ändert:

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

Leider scheint dies nur für * .py -Dateien zu funktionieren, und ich finde keine Möglichkeit, diese Funktionalität auf andere Dateien zu erweitern. Vor allem wäre es äußerst nützlich, wenn Flask die App neu startet, wenn sich eine template ändert. Ich habe nicht mehr gezählt, wie oft ich mit Markierungen in Vorlagen herumgespielt habe und verwirrt wurde, weil ich keine Änderungen sah, nur um herauszufinden, dass die App noch die alte Version der Jinja-Vorlage verwendete.

Gibt es eine Möglichkeit, Flask-Dateien im Verzeichnis templates überwachen zu lassen, oder müssen Sie in die Quelle des Frameworks eintauchen?

Bearbeiten : Ich verwende Ubuntu 10.10. Habe das nicht auf anderen Plattformen wirklich versucht.


Nach weiteren Untersuchungen habe ich festgestellt, dass Änderungen in Vorlagen in der Tat are in Echtzeit aktualisiert wurden, ohne die App selbst neu zu laden. Dies scheint jedoch nur für die Vorlagen zu gelten, die an flask.render_template übergeben werden.

Es kommt jedoch vor, dass ich in meiner App viele wiederverwendbare, parametrisierte Komponenten habe, die ich in Jinja-Vorlagen verwende. Sie sind als {% macro %}s implementiert, befinden sich in dedizierten "Modulen" und sind auf tatsächlichen Seiten {% import %}ed. All Nice and DRY ... außer, dass diese importierten Vorlagen anscheinend nie auf Änderungen geprüft werden, da sie render_template überhaupt nicht passieren.

(Seltsamerweise passiert dies nicht für Vorlagen, die über {% extends %} aufgerufen werden. Was {% include %} angeht, habe ich keine Ahnung, da ich sie nicht wirklich verwende.)

Zusammenfassend scheinen die Wurzeln dieses Phänomens irgendwo zwischen Jinja und Flask oder Werkzeug zu liegen. Ich schätze, es könnte eine Reise zum Bug-Tracker für eines dieser Projekte rechtfertigen :) Inzwischen habe ich die Antwort von jd. Akzeptiert, weil dies die Lösung ist, die ich tatsächlich verwendet habe - und es funktioniert wie ein Zauber.

58
Xion

Meiner Erfahrung nach benötigen Vorlagen nicht einmal einen Neustart der Anwendung, um sie zu aktualisieren, da sie bei jedem Aufruf von render_template() von der Festplatte geladen werden sollten. Möglicherweise werden Ihre Vorlagen jedoch anders verwendet.

Um Ihre Anwendung erneut zu laden, wenn sich die Vorlagen ändern (oder eine andere Datei), können Sie das Argument extra_files an Flask().run() übergeben, eine Sammlung von Dateinamen, die Sie beobachten möchten: Jede Änderung dieser Dateien löst den Reloader aus.

Beispiel:

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)

Siehe hier: http://werkzeug.pocoo.org/docs/0.10/serving/?highlight=run_simple#werkzeug.serving.run_simple

48
jd.

sie können verwenden

TEMPLATES_AUTO_RELOAD = True

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

Ob nach Änderungen der Vorlagenquelle gesucht und automatisch neu geladen werden soll. Standardmäßig ist der Wert None. Dies bedeutet, dass Flask die Originaldatei nur im Debug-Modus überprüft.

93
Loris

Wenn Sie mit jinja-Vorlagen arbeiten, müssen Sie einige Parameter einstellen. In meinem Fall mit python3 habe ich es mit dem folgenden Code gelöst:

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

Für mich funktioniert TEMPLATES_AUTO_RELOAD = True nicht (Version 0.12). Ich benutze jinja2 und was ich getan habe:

  1. Funktion before_request erstellen

    def before_request():
        app.jinja_env.cache = {}
    
  2. Registrieren Sie es in der Anwendung

    app.before_request(before_request)
    
  3. Das ist es.

8
dikkini

Was für mich funktioniert hat, ist folgendes hinzuzufügen:

@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 = {}

( aus @ dikkinis Antwort entnommen )

4
Garrett

Verwenden Sie die neueste Version von Flask unter Windows, verwenden Sie den Befehl Ausführen und den Debug-Befehl auf true. Die Flasche muss nicht zurückgesetzt werden, damit Änderungen an den Vorlagen wirksam werden. Versuchen Sie es mit Shift + F5 (oder Shift plus Reload-Taste), um sicherzustellen, dass nichts zwischengespeichert wird.

2
Drakekin

Bei mir klappt das ganz gut: 

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

Mehr dazu auf http://flask.pocoo.org/docs/1.0/config/

1
Nick Marhal

Stand Juni 2019:

Die flask CLI wird über app.run () zum Ausführen eines Dev-Servers empfohlen. Wenn wir also die CLI verwenden möchten, kann die akzeptierte Lösung nicht verwendet werden.

Die Verwendung der Entwicklungsversion von Flask (1.1) zum jetzigen Zeitpunkt ermöglicht es uns, eine Umgebungsvariable FLASK_RUN_EXTRA_FILES festzulegen, die im Grunde das Gleiche tut wie die akzeptierte Antwort.

Siehe diese Github-Ausgabe .

Beispielverwendung:

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

in Linux. Um mehrere zusätzliche Dateien anzugeben, trennen Sie die Dateipfade durch Doppelpunkte. , z.

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

Die CLI unterstützt auch ein Argument --extra-files ab Flask 1.1.

0
overseas

Siehe http://flask.pocoo.org/docs/1.0/quickstart/ Und FLASK_ENV=development verwenden.

0
Naxos84