Обновить приложение "Флажок" при изменении файла шаблона

По умолчанию при запуске приложения Flask с использованием встроенного сервера (Flask.run) он контролирует свои файлы Python и автоматически перезагружает приложение, если его код изменяется:

* Detected change in '/home/xion/hello-world/app.py', reloading
* Restarting with reloader

К сожалению, это, похоже, работает только для *.py файлов, и я, похоже, не нашел способа расширить эту функциональность до других файлов. Прежде всего, было бы чрезвычайно полезно перезапустить приложение Flask при изменении шаблона. Я потерял счет того, сколько раз я играл с шаблонами в шаблонах и путался, не видя никаких изменений, только чтобы узнать, что приложение все еще использует старую версию шаблона Jinja.

Итак, есть ли способ иметь файлы монитора Flask в каталоге шаблонов или требуется ли погружение в исходный код фрейма?

Изменить. Я использую Ubuntu 10.10. Не пробовал это на других платформах.


После дополнительного запроса я обнаружил, что изменения в шаблонах действительно обновляются в реальном времени, без перезагрузки самого приложения. Однако, похоже, это относится только к тем шаблонам, которые передаются в flask.render_template.

Но так получилось, что в моем приложении у меня есть много многоразовых, параметризованных компонентов, которые я использую в шаблонах Jinja. Они реализованы как {% macro %} s, находятся в выделенных "модулях" и {% import %} редактируются на фактические страницы. Все хорошие и сухие... за исключением того, что импортированные шаблоны, по-видимому, никогда не проверяются на модификации, поскольку они вообще не проходят через render_template.

(Любопытно, что этого не происходит для шаблонов, вызываемых через {% extends %}. Что касается {% include %}, я понятия не имею, поскольку я их действительно не использую.)

Итак, чтобы обернуть, корни этого явления, кажется, лежат где-то между Jinja и Flask или Werkzeug. Думаю, это может послужить поводом для отслеживания ошибок в любом из этих проектов. Между тем, я принял jd. ответ, потому что это решение, которое я фактически использовал, и оно работает как шарм.

Ответ 1

По моему опыту, для обновления шаблонов даже не требуется перезапуск приложения, так как они должны загружаться с диска каждый раз, когда render_template(). Может быть, ваши шаблоны используются по-другому, хотя.

Чтобы перезагрузить ваше приложение при изменении шаблонов (или любого другого файла), вы можете передать аргумент extra_files в Flask().run(), коллекцию имен файлов, которые нужно посмотреть: любое изменение в этих файлах вызовет перегрузчик.

Пример:

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)

Смотрите здесь: http://werkzeug.pocoo.org/docs/0.10/serving/?highlight=run_simple#werkzeug.serving.run_simple

Ответ 2

ты можешь использовать

TEMPLATES_AUTO_RELOAD = True

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

Нужно ли проверять наличие модификаций исходного шаблона и перезагружать его автоматически. По умолчанию значение равно None, что означает, что Flask проверяет исходный файл только в режиме отладки.

Ответ 3

Когда вы работаете с шаблонами 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')

Ответ 4

На самом деле для меня TEMPLATES_AUTO_RELOAD = True не работает (версия 0.12). Я использую jinja2 и что я сделал:

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

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

    app.before_request(before_request)
    
  3. Это.

Ответ 5

Что сработало для меня, просто добавьте это:

@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)

Ответ 6

Использование последней версии Flask в Windows, используя команду run и debug, установленную в true; Флажок не должен быть reset для внесения изменений в шаблоны. Попробуйте Shift + F5 (или Shift + кнопка перезагрузки), чтобы убедиться, что ничего не кэшировано.

Ответ 7

У меня работает просто отлично

 from flask import Flask, render_template, request, url_for, redirect
 app = Flask(__name__)
 app.config["TEMPLATES_AUTO_RELOAD"] = True

Подробнее на http://flask.pocoo.org/docs/1.0/config/