Перезагрузите приложение 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.ответ, потому что это решение я на самом деле использовал - и это работает как шарм.
881   6  

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 и то, что я сделал:

  1. создать функции before_request

    def before_request():
        app.jinja_env.cache = {}
    
  2. зарегистрировать его в приложении

    app.before_request(before_request)
    
  3. вот и все.

то, что сработало для меня, просто добавляет Это:

@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

    Ничего не найдено.