Flask jinja2 extends как передать данные в базовый шаблон?
Всем привет. Ситуация следующая.
Есть базовый шаблон, в котором определена шапка. В этой шапке есть уведомления, это динамический список который должен выводить информацию о новых уведомлениях пользователя.
Поскольку шапка для всех страниц одинаковая, было логично использовать её как базовый шаблон, и расширять его на необходимые страницы.
Проблема заключается в том, что данный шаблон нигде не вызывается, следовательно я не могу передать в него данные из бд, поскольку шаблонизатор должен получать данные явным образом при render_template.
Вопрос в том, каким образом я могу заранее отрсиовать шапку передав туда данные? Или мне нужно для каждой страницы в render_template передавать данные это явно не правильная реализация.
from flask import Blueprint
from utils import db_connect
app = Blueprint("name", __name__, template_folder='templates')
@app.route("/")
def index():
return render_template("index.html")
@app.context_processor
def any_data_processor():
with db_connect.connect() as con:
# тут же могла быть работа с кешем/API/файловой системой и др.
....
result = ...
return dict(any_data=result)
После этого обращаться внутри всех шаблонов можно без явной передачи туда контекста.
Описанный метод интересен, но моя проблема в том что в базовый шаблон не передаются данные, так-как он нигде не вызывается. И суть моего вопрос заключается в том как это сделать. Возможно есть какие-то инструкция, которая бы была аналогичной render_template. А потом уже обращаться к этому шаблону через super()
То есть проще говоря мне нужен пререндр базового шаблона
а с чего ты решил что не вызывается?
по идее при рендеринге сначала собирается шаблон из всех блоков и потом уже рендерится
ведь тот же title как то меняется на разных страницах, а он в шапке обычно
iddqda, с того что я его НЕ вызываю нигде. Он рендриться только при вызове конкретной страницы, как её часть, а не как самостоятельный блок (что мне и нужно). Я не хочу передавать данные о состоянии шапки в каждый роут при каждом рендре, это тупизм какой-то получается. Я хочу один раз объявить базовый шаблон, и передать в него всё что нужно, зафиксировав его состояние, а потом всякий раз когда он будет расширяться на других страницах, будет просто последовательный рендр:
отрисовка целевого шаблона (вызов)
├── передал свои данные в шаблонизатор.
отрисовка шапки (пре рендр)
└── уже должна быть определена в коде, и ожидать вызова как часть шаблона.
Иными словами, я не хочу каждый раз определять состояние шапки контектом вызываемого рендара, а хочу один раз задать ей параметр отрсисовки, и вызвать его всякий раз когда она импортируется (расширяется)
ведь тот же title как то меняется на разных страницах, а он в шапке обычно
Ты похоже не понимаешь как работает Jinja. Title как и любые данные, передаётся именованным аргументом при вызове ренда шаблона. Потом внутри шаблона определяется {% title%}
ага когда препод на экзамене наводящий вопрос задает это от того что он сам в нем не разбирается :)
а по сути вопроса:
ты хочешь зафиксировать статически динамические данные
имхо такой подход и есть «неправильная реализация» и «тупизм какойто»
не удивительно что стандартные инструменты не предусматривают такого поведения, ведь так никто не делает
iddqda, классное рассуждение, особенно фактология приятно удивляет.
ведь так никто не делает
Очень прогрессивный подход, надеюсь мир так и будет дальше развиваться.
По вашему, принцип don't repeat yourself придумали просто так?
Не понимаю вообще смысла в ваших сообщениях, они не несут никакого конструктива и смысловой нагрузки.