Перезагрузите приложение Flask при изменении файла шаблона - PullRequest
67 голосов
/ 01 марта 2012

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

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

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

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

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


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

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

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

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

Ответы [ 9 ]

103 голосов
/ 14 июля 2016

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

TEMPLATES_AUTO_RELOAD = True

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

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

54 голосов
/ 01 марта 2012

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

37 голосов
/ 25 апреля 2017

Когда вы работаете с 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')
8 голосов
/ 22 марта 2017

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

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

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

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

4 голосов
/ 04 апреля 2017

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

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

2 голосов
/ 24 февраля 2019

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

 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/

2 голосов
/ 01 марта 2012

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

1 голос
/ 20 ноября 2018

См. http://flask.pocoo.org/docs/1.0/quickstart/ и использовать FLASK_ENV=development

0 голосов
/ 03 июня 2019

Обновлено по состоянию на июнь 2019 года:

CLI для колб рекомендуется использовать вместо app.run () для запуска dev-сервера, поэтому, если мы хотим использовать CLI, то принятое решение использовать нельзя.

Использование версии разработки Flask (1.1) на момент написания этой статьи позволяет нам установить переменную окружения FLASK_RUN_EXTRA_FILES, которая фактически делает то же самое, что и принятый ответ.

См. этот выпуск GitHub .

Пример использования:

export FLASK_RUN_EXTRA_FILES="app/templates/index.html"
flask run

в Linux. Чтобы указать несколько дополнительных файлов, разделите пути к файлам двоеточиями. , например,

export FLASK_RUN_EXTRA_FILES="app/templates/index.html:app/templates/other.html"

CLI также поддерживает аргумент --extra-files с Flask 1.1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...