Эквивалент шаблонного контекста в 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 в пилонах.