Laden Sie die Flask-App neu, wenn sich die Vorlagendatei ändert

94

Wenn die Flask-Anwendung mit dem integrierten Server ( Flask.run) ausgeführt wird, überwacht sie standardmäßig ihre Python-Dateien und lädt die App automatisch neu, wenn sich ihr 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 anscheinend keine Möglichkeit, diese Funktionalität auf andere Dateien auszudehnen. Vor allem wäre es äußerst nützlich, wenn Flask die App neu startet, wenn sich eine Vorlage ändert. Ich habe die Zählung verloren, wie oft ich mit Markups in Vorlagen herumgespielt habe und verwirrt war, weil ich keine Änderungen gesehen habe, nur um herauszufinden, dass die App immer noch die alte Version der Jinja-Vorlage verwendet.

Gibt es eine Möglichkeit, Flask-Überwachungsdateien im Vorlagenverzeichnis zu haben , oder muss in die Quelle des Frameworks eingetaucht werden?

Edit : Ich benutze Ubuntu 10.10. Ich habe das auf keiner anderen Plattform wirklich versucht.


Nach einer weiteren Untersuchung habe ich , dass Änderungen in Vorlagen in der Tat entdeckt werden in Echtzeit aktualisiert werden , ohne erneutes Laden der App selbst. Dies scheint jedoch nur für die Vorlagen zu gelten, an die übergeben wird flask.render_template.

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 werden {% import %}in tatsächliche Seiten eingeteilt. Alles schön und trocken ... außer dass diese importierten Vorlagen anscheinend nie auf Änderungen überprüft werden, da sie überhaupt nicht durchlaufen werden render_template.

(Merkwürdigerweise geschieht dies nicht für Vorlagen aufgerufen durch {% extends %}. Was{% include %} Ich habe keine Ahnung, da ich sie nicht wirklich verwende.)

Zum Abschluss scheinen die Wurzeln dieses Phänomens irgendwo zwischen Jinja und Flask oder Werkzeug zu liegen. Ich denke, es könnte eine Reise zum Bug-Tracker für eines dieser Projekte rechtfertigen :) In der Zwischenzeit habe ich die JD akzeptiert . Die Antwort, denn das ist die Lösung, die ich tatsächlich verwendet habe - und sie funktioniert wie ein Zauber.

Xion
quelle
3
Stellen Sie sicher, dass die mit DEBUG = True konfigurierte App in den Dokumenten enthalten ist .
Alex Morega

Antworten:

64

Nach meiner Erfahrung muss die Anwendung für Vorlagen nicht einmal neu gestartet werden, um aktualisiert zu werden, da sie jedes Mal von der Festplatte geladen werden sollten render_template() . Möglicherweise werden Ihre Vorlagen jedoch anders verwendet.

Um Ihre Anwendung neu zu laden, wenn sich die Vorlagen ändern (oder eine andere Datei), können Sie das extra_filesArgument an übergebenFlask().run() eine Sammlung von zu beobachtenden Dateinamen übergeben: Jede Änderung an diesen Dateien löst den Neuladen aus.

Beispiel:

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)

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

jd.
quelle
Gutes Zeug! Ich gebe zu, ich habe den Link in der Dokumentation verpasst, der Flask.runzu Werkzeug-Dokumenten führte. Diese spezielle Option scheint jedoch nützlich genug zu sein, um sie zumindest in Flask-Dokumenten zu erwähnen.
Xion
Wenn jemand auf einen Fehler stößt, der besagt No such file or directory, versuchen Sie, den relativen Pfad wie folgt zu verwenden:extra_dirs = ['./directory/to/watch',]
Kevin
3
Wenn auch Sie verwirrt sind, was pathist, ist es os.path. dachte, es wäre erwähnenswert
bjesus
Informationen zum automatischen Neuladen nach dem Ändern statischer Dateien finden Sie hier .
Simanacci
1
Haben Sie eine Idee, wie Sie zusätzliche Dateien angeben können, wenn Sie flask runüber die Befehlszeile ausgeführt werden?
Michael Scheper
143

Sie können verwenden

TEMPLATES_AUTO_RELOAD = True

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

Gibt an, ob nach Änderungen an der Vorlagenquelle gesucht und diese automatisch neu geladen werden sollen. Standardmäßig ist der Wert None, was bedeutet, dass Flask die Originaldatei nur im Debug-Modus überprüft.

Loris
quelle
11
Diese Lösung ist konventionell, wird durch Dokumentation unterstützt, ist einfach zu verstehen und leicht zu implementieren. Es sollte akzeptiert werden!
Carolyn Conway
Ich habe diese Antwort versucht, aber es funktioniert nur einmal, nach einer weiteren Aktualisierung würde es nicht funktionieren
medev21
3
Nur ein Hinweis für andere: Ich habe es getan app.config['TEMPLATES_AUTO_RELOAD'] = Trueund aus irgendeinem Grund erwartet, dass der Server automatisch neu gestartet wird, wenn sich eine Vorlage ändert, wie dies im Debug-Modus der Fall ist. Es wird nicht neu gestartet, aber es aktualisiert die Vorlage, die es rendert.
cs01
3
Gibt es einen Grund, warum dies für 0.12 nicht funktionieren würde? oder eine andere Einstellung, die dies verhindern würde?
user805981
3
@Federer Es scheint nicht mehr so ​​zu funktionieren wie früher ... Vorher hätte es die Änderungen im Vorlagenverzeichnis und in den Unterverzeichnissen erkannt und den Server neu geladen ... Ist das etwas Neues in 0.12? geändert?
user805981
53

Wenn Sie mit jinjaVorlagen arbeiten, müssen Sie einige Parameter festlegen. In meinem Fall mit Python3 habe ich es mit dem folgenden Code gelöst:

if __name__ == '__main__':
    app.jinja_env.auto_reload = True
    app.config['TEMPLATES_AUTO_RELOAD'] = True
    app.run(debug=True, host='0.0.0.0')
Silgon
quelle
1
Du hast meine geistige Gesundheit gerettet. Danke dir.
Nostalg.io
Ich hatte auch Schwierigkeiten mit diesem Problem. Ich bin froh, dass ich helfen konnte;)
Silgon
Dies funktioniert für mich in Flasche 1.0.2, aber ich habe kein Host-Argument.
Enrico Borba
Ja @EnricoBorba, du wirst es wahrscheinlich nicht brauchen. Ich benutze es normalerweise, weil ich mit Docker lokal debugge und manchmal von einem anderen Container aus auf die Anwendung zugegriffen werden muss. Einige Referenz
Silgon
@ Silgon Ja, ich verstehe. Ich habe hauptsächlich nur einen Kommentar hinzugefügt, um klar zu machen, was bei einer Neuinstallation von Flask Version 1.0.2
Enrico Borba
10

Eigentlich TEMPLATES_AUTO_RELOAD = Truefunktioniert bei mir nicht (Version 0.12). Ich benutze jinja2 und was ich getan habe:

  1. Funktion erstellen before_request

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

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

Dikkini
quelle
3
Garret, ich habe nicht ohne diese Optionen getestet.
Dikkini
Der Schritt 3 ist nicht wirklich notwendig, er hat bei mir sehr gut funktioniert.
Ricardo Ribeiro
4

Was für mich funktioniert hat, ist nur 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 = {}

( entnommen aus @ dikkinis Antwort )

Garrett
quelle
2

Verwenden der neuesten Version von Flask unter Windows, Verwenden des Befehls run und Debuggen auf true. Flask muss nicht zurückgesetzt werden, damit Änderungen an Vorlagen wirksam werden. Versuchen Sie Shift + F5 (oder Shift plus die Reload-Taste), um sicherzustellen, dass nichts zwischengespeichert wird.

Drakekin
quelle
1

Aktualisiert ab Juni 2019:

Die Kolben-CLI Flask- wird über app.run () zum Ausführen eines Entwicklungsservers 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 effektiv dasselbe tut wie die akzeptierte Antwort.

Siehe dieses Github-Problem .

Anwendungsbeispiel:

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

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

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

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

Übersee-
quelle
kleines Update. Der Link zu 'Flask CLI' muss auf die aktuelle Version aktualisiert werden. flask.palletsprojects.com/de/1.1.x/cli sonst danke :)
CodingMatters
1

Vorlagen werden automatisch neu geladen. Warum nicht ctrl+f5die Webseite aktualisieren, da Webbrowser normalerweise den Cache speichern.

Chef Shiv
quelle