【问题标题】:Python+Pyramid+Mako: What is the difference between the context in event, context in view and context in template?Python+Pyramid+Mako:事件中的上下文、视图中的上下文和模板中的上下文有什么区别?
【发布时间】:2012-03-09 23:19:34
【问题描述】:

我一直在努力理解这一点,但无法完全确定有关它的精确文档。我对这个 Python Pyramid+Mako 设置中上下文的不同含义感到很困惑。

这是一些代码 sn-ps(如果您需要更多 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 模板中,举个例子,我只有:

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

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

【问题讨论】:

    标签: python pyramid mako


    【解决方案1】:

    首先,忽略request.tmpl_context。这只是request 对象上的一个字典,您可以向其中添加内容,并且通常根本不用于 Pyramid 应用程序。它是 Pylons 合并的继子。

    使用 Mako 时有两个 context 对象。第一个 (mako.runtime.Context) 由 Mako 提供:http://docs.makotemplates.org/en/latest/runtime.html#context

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

    【讨论】:

    • 我相信没有人会想到更好的解释,所以我会接受这个答案,因为它回答了我的问题。
    • @michael-merickel:我们可以在金字塔文档中找到此信息吗?如果没有,我们应该更新它吗?谢谢!
    • afaik _context 是无证的.. github.com/Pylons/pyramid/issues/530,但是 request.tmpl_context 几乎没有用处,实际上现在已经被文档弃用了。
    猜你喜欢
    • 1970-01-01
    • 2010-09-27
    • 1970-01-01
    • 1970-01-01
    • 2020-10-29
    • 2020-01-19
    • 2020-09-13
    • 2015-08-04
    • 1970-01-01
    相关资源
    最近更新 更多