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.
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
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.
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')
Für mich funktioniert TEMPLATES_AUTO_RELOAD = True
nicht (Version 0.12). Ich benutze jinja2 und was ich getan habe:
Funktion before_request
erstellen
def before_request():
app.jinja_env.cache = {}
Registrieren Sie es in der Anwendung
app.before_request(before_request)
Das ist es.
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 )
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.
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/
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.
Siehe http://flask.pocoo.org/docs/1.0/quickstart/ Und FLASK_ENV=development
verwenden.