Эквивалент шаблонного контекста в Pyramid (пользователь pylons)
Что эквивалентно контексту шаблона в Pyramid?
Имеет ли событие IBeforeRender в пирамиде что-нибудь с этим? Я прошел официальную документацию, но я понял, что именно происходит с событием IBeforeRender.
Ответы
Ответ 1
Pyramid уже предоставляет tmpl_context
в своем объекте Request, так что просто вам просто нужно подписаться на событие BeforeRender
, чтобы добавить его в глобальные компоненты рендеринга:
def add_renderer_globals(event):
event['c'] = request.tmpl_context
event['tmpl_context'] = request.tmpl_context
config.add_subscriber(add_renderer_globals, 'pyramid.events.BeforeRender')
С этого момента в вашем коде, когда вы получаете запрос, вы можете установить на нем следующие параметры:
request.tmpl_context.name = 'Bob'
И впоследствии ваш шаблон может ссылаться на переменную name
:
${ c.name }
Ответ 2
Если вместо этого вы надеетесь на какую-то "глобальную сумку", где вы можете набивать переменные, которые будут доступны для каждого шаблона, тогда ваш вопрос о IBeforeRender подходит.
from pyramid.events import subscriber
from pyramid.events import BeforeRender
@subscriber(BeforeRender)
def add_global(event):
event['name'] = 'Pyramid Developer'
Существует альтернативный способ добавления глобалов при настройке Configurator. Вы можете увидеть полную информацию по адресу: http://docs.pylonsproject.org/projects/pyramid/en/latest/narr/hooks.html#using-the-before-render-event
Ответ 3
Мне кажется, что вышеупомянутые решения не совсем копируют поведение контекста шаблона Pylons. Если вы производите запрос страницы в Pylons и добавляет некоторое значение a
в контекст c
, он доступен в шаблоне как c.a
. Однако, если один из них выдаст другой запрос, этот ключ/значение будет удален.
Пирамидные решения выше показывают другое поведение. ключ/значение c.a
останется в контексте шаблона. Иногда это нежелательно. Есть ли какие-либо предложения по исправлению этой разницы?
Ответ 4
Pyramid действительно не раскрывает "контекст шаблона" для разработчика (хотя он используется внутри различных привязок механизма шаблонов для Pyramid).
Обычно, если вы хотите что-то вставить в "c" для использования внутри шаблона, вы просто передаете его как аргумент ключевого слова вызову render_to_response() или как часть dict, который вы возвращаете с помощью предопределенного рендеринга.
Чтобы сделать что-то подобное http://pylonsbook.com/en/1.1/using-view-templates.html#using-the-template-context-c-global, вы бы сделали:
@view_config(renderer="greeting.mako")
def index(request):
return {'name': 'Pyramid Developer'}
И приветствие .mako:
<html>
<head>
<title>Greetings</title>
</head>
<body>
<h1>Greetings</h1>
<p>Hello ${name}!</p>
</body>
</html>
Ответ 5
Из Pylons magic globals в разделе "Кулинарная книга пирамид":
Пилоны имеют несколько магических глобалов, которые содержат данные состояния для текущий запрос. Вот ближайшие эквиваленты пирамиды:
(...)
pylons.tmpl_context
Объект нуля для локальных данных запроса, обычно используемых для передачи переменных к шаблону. В Pyramid вы возвращаете параметр переменных и допускаете рендеринг применяет их к шаблону. Или вы можете отобразить шаблон самостоятельно в поле зрения.
Если представление является методом, вы также можете установить переменные экземпляра. Вид экземпляр отображается как view
в шаблонах. Существуют два основных метода использования для этого. Один, чтобы установить переменные для шаблона сайта, которые иначе должны быть в каждом возврате dict. Два, для переменных, которые специфичный для рендеринга HTML, когда представление зарегистрировано как с HTML-рендеринга и не-HTML-рендерера (например, JSON).
Пирамида имеет порт "tmpl_context" в request.tmpl_context
, который отображается в шаблонах как c
. Однако он никогда не Pyramid-Pylons и больше не документированы.
Ответ 6
Если вы ищете глобальный словарь для удобного переноса переменных между шаблонами и представлениями, используйте pyramid.request.TemplateContext
На странице шаблона:
<%!
from pyramid.request import TemplateContext as c
c.foo = 123
%>
Затем вы можете получить доступ к переменной, импортируя TemplateContext в свои представления таким же образом:
from pyramid.request import TemplateContext as c
Это должно быть более или менее эквивалентно tmpl_context в пилонах.