Метод context_processor
Метод context_processor применяется к объекту blueprint и
регистрирует функцию, возвращающую словарь с переменными.
Эти переменные становятся доступны во всех Jinja-шаблонах,
которые рендерятся внутри маршрутов данного blueprint.
Функция-обработчик не принимает аргументов и должна
возвращать словарь. Метод можно вызвать несколько раз,
тогда словари от разных функций объединяются.
Контекстные процессоры удобны для передачи общих данных: настроек сайта, текущего пользователя, элементов меню и других значений, нужных почти в каждом шаблоне.
Синтаксис
@bp.context_processor
def func():
return dict_var
Пример
Давайте создадим blueprint и зарегистрируем контекстный
процессор, который передаёт в шаблон переменную site_name:
from flask import Flask, Blueprint, render_template
app = Flask(__name__)
bp = Blueprint('bp', __name__)
@bp.context_processor
def inject_site():
return {'site_name': 'abcde'}
@bp.route('/')
def index():
return render_template('index.html')
app.register_blueprint(bp)
Теперь создадим шаблон, который использует эту переменную:
<p>{{ site_name }}</p>
Результат выполнения кода для адреса /:
<p>abcde</p>
Пример
Давайте зарегистрируем два контекстных процессора и посмотрим, как объединяются их словари:
from flask import Flask, Blueprint, render_template
app = Flask(__name__)
bp = Blueprint('bp', __name__)
@bp.context_processor
def inject_user():
return {'user': 'user'}
@bp.context_processor
def inject_article():
return {'article': 'article'}
@bp.route('/')
def index():
return render_template('index.html')
app.register_blueprint(bp)
Создадим шаблон, который выводит обе переменные:
<p>{{ user }}</p>
<p>{{ article }}</p>
Результат выполнения кода для адреса /:
<p>user</p>
<p>article</p>
Пример
Давайте передадим в шаблон список значений и выведем его через цикл:
from flask import Flask, Blueprint, render_template
app = Flask(__name__)
bp = Blueprint('bp', __name__)
@bp.context_processor
def inject_items():
return {'items': ['a', 'b', 'c', 'd', 'e']}
@bp.route('/')
def index():
return render_template('index.html')
app.register_blueprint(bp)
Создадим шаблон, который перебирает элементы списка:
{% for item in items %}
<p>{{ item }}</p>
{% endfor %}
Результат выполнения кода для адреса /:
<p>a</p>
<p>b</p>
<p>c</p>
<p>d</p>
<p>e</p>
Смотрите также
-
класс
Blueprint,
который создаёт группу маршрутов приложения -
метод
route,
который регистрирует маршрут внутри blueprint -
метод
template_filter,
который регистрирует фильтр Jinja для blueprint -
метод
template_global,
который регистрирует глобальную функцию Jinja