Перезагрузите приложение Flask при изменении файла шаблона
по умолчанию при запуске приложения Flask используется встроенный сервер (Flask.run), он отслеживает свои файлы Python и автоматически перезагружает приложение, если его код изменяется:
* Detected change in '/home/xion/hello-world/app.py', reloading
* Restarting with reloader
к сожалению, это, кажется, работает только для*.py файлов, и я, кажется, не нахожу никакого способа расширить эту функциональность на другие файлы. В частности, было бы чрезвычайно полезно иметь колбу перезапустить приложение, когда шаблон изменения. Я потерял счет на сколько раз я возился с разметкой в шаблонах и запутался, не видя никаких изменений, только чтобы узнать, что приложение все еще использует старую версию шаблона Jinja.
Итак, есть ли способ иметь файлы монитора колбы в шаблоны каталог, или это требует погружения в источник фреймворка?
Edit: я использую Ubuntu 10.10. Не пробовал это ни на каких других платформах на самом деле.
после далее запрос, я обнаружил, что изменения в шаблонах действительно are обновление в режиме реального времени, без перезагрузки самого приложения. Однако, похоже, это относится только к тем шаблонам, которые передаются в flask.render_template.
но так получилось, что в моем приложении у меня есть довольно много многоразовых, параметризованных компонентов, которые я использую в шаблонах Jinja. Они реализуются как {% macro %}s, находятся в выделенных "модулях" и являются {% import %}ed в фактические страницы. Все хорошо и сухо... разве что эти импортированные шаблоны, по-видимому, никогда не проверяются на изменения, так как они не проходят через render_template на всех.
(Любопытно, что это не происходит для шаблонов, вызываемых через {% extends %}. Что касается {% include %}, Я понятия не имею, как я действительно не использую их.)
jd.ответ, потому что это решение я на самом деле использовал - и это работает как шарм.
6 ответов:
по моему опыту, шаблоны даже не нужно приложение для перезагрузки, чтобы быть обновлены, так как они должны быть загружены с диска каждый раз
render_template()называется. Возможно, ваши шаблоны используются по-разному, хотя.чтобы перезагрузить приложение при изменении шаблонов (или любого другого файла), вы можете передать до
Flask().run(), коллекция имен файлов для просмотра:любое изменение в этих файлах вызовет перезагрузку.пример:
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)посмотреть здесь: http://werkzeug.pocoo.org/docs/0.10/serving/?highlight=run_simple#werkzeug.serving.run_simple
можно использовать
TEMPLATES_AUTO_RELOAD = Trueот http://flask.pocoo.org/docs/1.0/config/
следует ли проверять наличие изменений в источнике шаблона и автоматически перезагружать его. По умолчанию значение равно None, что означает, что Flask проверяет исходный файл только в режиме отладки.
когда вы работаете с
jinjaшаблоны, вам нужно установить некоторые параметры. В моем случае с python3, я решил его с помощью следующего кода:if __name__ == '__main__': app.jinja_env.auto_reload = True app.config['TEMPLATES_AUTO_RELOAD'] = True app.run(debug=True, host='0.0.0.0')
на самом деле для меня
TEMPLATES_AUTO_RELOAD = Trueне работает (версия 0.12). Я использую jinja2 и то, что я сделал:
создать функции
before_requestdef before_request(): app.jinja_env.cache = {}зарегистрировать его в приложении
app.before_request(before_request)вот и все.
то, что сработало для меня, просто добавляет Это:
@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 = {}( взято из ответа @dikkini)
используя последнюю версию Flask в Windows, используя команду run и debug, установленную в true;Flask не нужно сбрасывать для внесения изменений в шаблоны. Попробуйте Shift+F5 (или Shift плюс кнопка перезагрузки), чтобы убедиться, что он не кэшируется.
Comments