Что эквивалентно контексту шаблона в Pyramid?
Имеет ли событие IBeforeRender в пирамиде что-нибудь с этим? Я прошел официальную документацию, но я понял, что именно происходит с событием IBeforeRender.
Что эквивалентно контексту шаблона в Pyramid?
Имеет ли событие IBeforeRender в пирамиде что-нибудь с этим? Я прошел официальную документацию, но я понял, что именно происходит с событием IBeforeRender.
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 }
Если вместо этого вы надеетесь на какую-то "глобальную сумку", где вы можете набивать переменные, которые будут доступны для каждого шаблона, тогда ваш вопрос о 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
Мне кажется, что вышеупомянутые решения не совсем копируют поведение контекста шаблона Pylons. Если вы производите запрос страницы в Pylons и добавляет некоторое значение a в контекст c, он доступен в шаблоне как c.a. Однако, если один из них выдаст другой запрос, этот ключ/значение будет удален.
Пирамидные решения выше показывают другое поведение. ключ/значение c.a останется в контексте шаблона. Иногда это нежелательно. Есть ли какие-либо предложения по исправлению этой разницы?
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>
Из Pylons magic globals в разделе "Кулинарная книга пирамид":
Пилоны имеют несколько магических глобалов, которые содержат данные состояния для текущий запрос. Вот ближайшие эквиваленты пирамиды:
(...)
pylons.tmpl_context
Объект нуля для локальных данных запроса, обычно используемых для передачи переменных к шаблону. В Pyramid вы возвращаете параметр переменных и допускаете рендеринг применяет их к шаблону. Или вы можете отобразить шаблон самостоятельно в поле зрения.
Если представление является методом, вы также можете установить переменные экземпляра. Вид экземпляр отображается как
viewв шаблонах. Существуют два основных метода использования для этого. Один, чтобы установить переменные для шаблона сайта, которые иначе должны быть в каждом возврате dict. Два, для переменных, которые специфичный для рендеринга HTML, когда представление зарегистрировано как с HTML-рендеринга и не-HTML-рендерера (например, JSON).Пирамида имеет порт "tmpl_context" в
request.tmpl_context, который отображается в шаблонах какc. Однако он никогда не Pyramid-Pylons и больше не документированы.
Если вы ищете глобальный словарь для удобного переноса переменных между шаблонами и представлениями, используйте pyramid.request.TemplateContext
На странице шаблона:
<%!
from pyramid.request import TemplateContext as c
c.foo = 123
%>
Затем вы можете получить доступ к переменной, импортируя TemplateContext в свои представления таким же образом:
from pyramid.request import TemplateContext as c
Это должно быть более или менее эквивалентно tmpl_context в пилонах.