Событие before_render_template
Событие before_render_template относится к сигналам Flask и срабатывает перед тем, как шаблон будет отрендерен. Оно отправляется с двумя аргументами: sender - приложение Flask, и template - объект шаблона, а также context - словарь контекста, переданный в шаблон. Это событие удобно использовать для добавления или изменения данных, которые должны быть доступны в шаблоне, но ещё не были переданы в него.
Сигнал доступен через объект flask.template_rendered и его подписчиков. Для подключения обработчика используется метод connect, для отключения - disconnect.
Синтаксис
from flask import Flask, template_rendered
app = Flask(__name__)
@template_rendered.connect_via(app)
def handler(sender, template, context, **extra):
pass
Или через декоратор connect_via, который автоматически привязывает сигнал к приложению.
Пример
Давайте создадим простое приложение, которое при рендеринге шаблона добавляет в контекст дополнительную переменную extra_text:
from flask import Flask, render_template, template_rendered
app = Flask(__name__)
@template_rendered.connect_via(app)
def before_render(sender, template, context, **extra):
context['extra_text'] = 'hello from signal'
@app.route('/')
def index():
return render_template('index.html')
Шаблон index.html:
<p>{{ extra_text }}</p>
Результат выполнения кода:
<p>hello from signal</p>
Пример
Давайте изменим контекст шаблона в зависимости от того, какой шаблон рендерится:
from flask import Flask, render_template, template_rendered
app = Flask(__name__)
@template_rendered.connect_via(app)
def before_render(sender, template, context, **extra):
if template.name == 'index.html':
context['title'] = 'article'
else:
context['title'] = 'user'
@app.route('/')
def index():
return render_template('index.html')
@app.route('/user')
def user():
return render_template('user.html')
Шаблон index.html:
<h1>{{ title }}</h1>
Шаблон user.html:
<h1>{{ title }}</h1>
Результат выполнения кода для адреса /:
<h1>article</h1>
Результат выполнения кода для адреса /user:
<h1>user</h1>
Смотрите также
-
событие
template_rendered,
которое срабатывает после рендеринга шаблона -
метод
connect,
который подключает обработчик к сигналу -
метод
disconnect,
который отключает обработчик от сигнала -
класс
Signal,
который представляет собой сигнал Flask