2012-02-19 4 views
2

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

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

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 на мой взгляд и мой подписчик.

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

ответ

4

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

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

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

+0

Я считаю, что никто еще будет думать лучшее объяснение, так что я буду принимать этот ответ, как он отвечает на мои вопросы – Danosaure

+0

@ майкл-merickel:.. Можно ли найти эту информацию в pyramid doc? Если нет, следует ли обновить его? Thx! – Hadrien

+0

afaik '_context' недокументирован. https://github.com/Pylons/pyramid/issues/530, однако' request.tmpl_context' служит очень малоцелевой цели и на данный момент он устарел. –

Смежные вопросы