Domyślnie, uruchamiając aplikację Flask przy użyciu wbudowanego serwera ( Flask.run
), monitoruje ona swoje pliki w języku Python i automatycznie ponownie ładuje aplikację, jeśli jej kod ulegnie zmianie:
* Detected change in '/home/xion/hello-world/app.py', reloading
* Restarting with reloader
Niestety, wydaje się, że działa to tylko dla plików * .py i nie wydaje mi się, aby znaleźć sposób na rozszerzenie tej funkcji na inne pliki. Przede wszystkim niezwykle przydatne byłoby ponowne uruchomienie aplikacji Flask po zmianie szablonu . Straciłem rachubę, ile razy majstrowałem przy znacznikach w szablonach i byłem zdezorientowany, nie widząc żadnych zmian, tylko po to, aby dowiedzieć się, że aplikacja nadal używa starej wersji szablonu Jinja.
Czy jest więc sposób na umieszczenie plików monitora Flask w katalogu szablonów , czy też wymaga to zanurzenia się w źródłach frameworka?
Edycja : używam Ubuntu 10.10. Tak naprawdę nie próbowałem tego na żadnej innej platformie.
Po dalszym dochodzeniu odkryłem, że zmiany w szablonach są rzeczywiście aktualizowane w czasie rzeczywistym, bez ponownego ładowania samej aplikacji. Wydaje się jednak, że dotyczy to tylko tych szablonów, które są przekazywane do flask.render_template
.
Tak się jednak składa, że w swojej aplikacji mam całkiem sporo sparametryzowanych komponentów wielokrotnego użytku, których używam w szablonach Jinja. Są zaimplementowane jako {% macro %}
s, znajdują się w dedykowanych „modułach” i są umieszczane {% import %}
na rzeczywistych stronach. Wszystko ładne i SUCHE ... poza tym, że te zaimportowane szablony najwyraźniej nigdy nie są sprawdzane pod kątem modyfikacji, ponieważ w ogóle nie przechodzą render_template
.
(Co ciekawe, nie dzieje się tak w przypadku szablonów wywoływanych za pośrednictwem {% extends %}
. {% include %}
Nie mam pojęcia, ponieważ tak naprawdę ich nie używam).
Podsumowując, korzenie tego zjawiska wydają się leżeć gdzieś pomiędzy Jinją a Flaskiem lub Werkzeugiem. Myślę, że to może uzasadniać podróż do śledzenia błędów dla któregokolwiek z tych projektów :) W międzyczasie zaakceptowałem jd. odpowiedź, ponieważ właśnie tego użyłem - i działa jak urok.
Odpowiedzi:
Z mojego doświadczenia
render_template()
wynika , że szablony nie wymagają nawet ponownego uruchamiania aplikacji w celu odświeżenia, ponieważ powinny być ładowane z dysku przy każdym wywołaniu. Może jednak twoje szablony są używane inaczej.Aby przeładować aplikację, gdy zmieniają się szablony (lub jakikolwiek inny plik), możesz przekazać
extra_files
argument doFlask().run()
kolekcji nazw plików do obejrzenia: każda zmiana w tych plikach spowoduje ponowne załadowanie .Przykład:
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)
Zobacz tutaj: http://werkzeug.pocoo.org/docs/0.10/serving/?highlight=run_simple#werkzeug.serving.run_simple
źródło
Flask.run
która prowadzi do dokumentów Werkzeug. Ale ta konkretna opcja wydaje się wystarczająco użyteczna, aby przynajmniej wspomnieć o niej w dokumentach Flaska.No such file or directory
, spróbuj użyć ścieżki względnej, jak w:extra_dirs = ['./directory/to/watch',]
path
, co jest, to takos.path
. pomyślałem, że warto o tym wspomniećflask run
z wiersza poleceń?możesz użyć
TEMPLATES_AUTO_RELOAD = True
Z http://flask.pocoo.org/docs/1.0/config/
źródło
app.config['TEMPLATES_AUTO_RELOAD'] = True
iz jakiegoś powodu spodziewałem się, że serwer automatycznie uruchomi się ponownie po zmianie szablonu, tak jak w trybie debugowania. Nie uruchamia się ponownie, ale aktualizuje szablon, który renderuje.Podczas pracy z
jinja
szablonami musisz ustawić niektóre parametry. W moim przypadku z pythonem3 rozwiązałem to za pomocą następującego kodu:if __name__ == '__main__': app.jinja_env.auto_reload = True app.config['TEMPLATES_AUTO_RELOAD'] = True app.run(debug=True, host='0.0.0.0')
źródło
U mnie działa dobrze:
from flask import Flask, render_template, request, url_for, redirect app = Flask(__name__) app.config["TEMPLATES_AUTO_RELOAD"] = True
Zobacz więcej na http://flask.pocoo.org/docs/1.0/config/
źródło
Właściwie u mnie
TEMPLATES_AUTO_RELOAD = True
nie działa (wersja 0.12). Używam jinja2 i co zrobiłem:Utwórz funkcję
before_request
def before_request(): app.jinja_env.cache = {}
Zarejestruj go w aplikacji
Otóż to.
źródło
To, co zadziałało, to po prostu dodanie tego:
@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 = {}
( zaczerpnięte z odpowiedzi @ dikkini )
źródło
Używając najnowszej wersji Flaska w systemie Windows, używając polecenia uruchom i debugowania ustawionego na true; Flask nie musi być resetowany, aby zmiany w szablonach zostały wprowadzone. Wypróbuj Shift + F5 (lub Shift i przycisk ponownego ładowania), aby upewnić się, że nic nie jest buforowane.
źródło
Zaktualizowano w czerwcu 2019 r .:
Kolba CLI jest zalecany przez app.run () uruchamiania serwera dev, więc jeśli chcemy korzystać z CLI następnie przyjętego rozwiązania nie mogą być użyte.
Korzystanie z rozwojowej wersji Flask (1.1) w chwili pisania tego tekstu pozwala nam ustawić zmienną środowiskową FLASK_RUN_EXTRA_FILES, która skutecznie robi to samo, co zaakceptowana odpowiedź.
Zobacz ten problem na githubie .
Przykładowe użycie:
export FLASK_RUN_EXTRA_FILES="app/templates/index.html" flask run
w Linuksie. Aby określić wiele dodatkowych plików, oddziel ścieżki plików dwukropkami. , np
export FLASK_RUN_EXTRA_FILES="app/templates/index.html:app/templates/other.html"
Interfejs CLI obsługuje również
--extra-files
argument z Flask 1.1.źródło
Zobacz http://flask.pocoo.org/docs/1.0/quickstart/ i użyj
FLASK_ENV=development
źródło
Szablony są ładowane automatycznie, dlaczego nie
ctrl+f5
odświeżać strony internetowej, ponieważ przeglądarki internetowe zwykle oszczędzają pamięć podręczną.źródło