繁体   English   中英

Python + Pyramid + Mako:事件上下文,视图上下文和模板上下文之间有什么区别?

[英]Python+Pyramid+Mako: What is the difference between the context in event, context in view and context in template?

我一直在努力理解这一点,但不能完全专注于有关它的精确文档。 我对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模板中,仅举一个例子,我只有:

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

感谢您提供任何帮助我理解的提示。

首先,忽略request.tmpl_context 这只是您可以向其中添加内容的request对象上的字典,通常在金字塔应用程序中根本不使用。 这是Pylons合并后的继子。

使用Mako时有两个context对象。 第一个( mako.runtime.Context )由Mako提供: http : mako.runtime.Context

金字塔通常在您的模板中将遍历上下文( MyPKG.Root )作为context公开。 但是,Mako已经有一个使用该名称的变量。 :-(因此,Pyramid的context实际上称为_context

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM