Python + Pyramid + Mako: В чем разница между контекстом в событии, контекстом в представлении и контекстом в шаблоне? - PullRequest
2 голосов
/ 19 февраля 2012

Я изо всех сил пытался понять это, но не могу точно указать точную документацию по этому поводу. Я совершенно сбит с толку из-за различного значения контекста в этой настройке Python Pyramid + Mako.

Вот некоторые фрагменты кода (скажите, если вам нужно больше context ):

class Root(object):
    request = None
    def __init__(self, request):
        self.request = request

@events.subscriber(events.BeforeRender)
def add_renderer_globals(event):
    event[u'c'] = event[u'request'].tmpl_context
    print u"add_renderer_globals(): request.tmpl_context={0}".format(event[u'request'].tmpl_context)
    print u"add_renderer_globals(): context={0}".format(event[u'context'])

@view.view_config(route_name='login', request_method='GET', renderer='login.mako')
def login_get(context, request):
    print u"login_get(): context={0}".format(context)
    return {}

[...]
cfg = config.Configurator(root_factory=Root,
        package=MyPKG,
        settings=settings,
        session_factory=pyramid_beaker.session_factory_from_settings(settings),
        )

cfg.add_route(name='login', pattern='/login')

cfg.scan()

и в моем шаблоне мако, просто для примера, у меня есть только:

Mako template context=${context}

Итак, я бы сделал запрос и получил следующие выводы из консоли или браузера:

login_get(): context=<MyPKG.Root object at 0x1523c90>
add_renderer_globals(): request.tmpl_context=<pyramid.request.TemplateContext object at 0x12fbc50>
add_renderer_globals(): context=<MyPKG.Root object at 0x1523c90>
Mako template context=<mako.runtime.Context object at 0x15a4950>

Мой вопрос: каковы различия и для чего вы их используете? Я также запутался, почему семантически я объявил root_factory=MyPKG.Root, и он становится context=MyPKG.Root, на мой взгляд, и моим подписчиком.

Спасибо за любую подсказку, чтобы помочь мне понять.

1 Ответ

4 голосов
/ 19 февраля 2012

Во-первых, игнорировать request.tmpl_context. Это просто словарь для объекта request, к которому можно добавлять элементы, и он обычно не используется в приложениях Pyramid. Это сводный ребенок от слияния пилонов.

При использовании Мако есть два context объекта. Первый (mako.runtime.Context) предоставлен Мако: http://docs.makotemplates.org/en/latest/runtime.html#context

Пирамида обычно предоставляет контекст обхода (MyPKG.Root) как context в ваших шаблонах. Однако у Мако уже есть переменная с таким именем. :-( Таким образом, пирамида context на самом деле называется _context.

...