Pyramid中的模板上下文等价物(pylons用户)

14 投票
6 回答
2822 浏览
提问于 2025-04-16 14:56

在Pyramid框架中,模板上下文是什么?

Pyramid中的IBeforeRender事件和这个有什么关系吗?我看过官方文档,但还是不太明白IBeforeRender事件到底是什么。

6 个回答

2

我觉得上面的解决方案并没有完全模拟Pylons模板上下文的行为。在Pylons中,如果你处理一个页面请求并把某个值a添加到上下文c中,那么在模板里你可以通过c.a来访问这个值。不过,如果你再处理另一个请求,这个键值对就会消失。

而上面提到的Pyramid解决方案则表现得不一样,c.a这个键值对会一直保留在模板上下文中。有时候,这种情况并不是我们想要的。有没有什么建议可以解决这个差异呢?

6

如果你想要一个“全局的袋子”,可以把变量放进去,让它们在每个模板中都能用,那么你关于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

11

Pyramid框架在它的请求对象上已经提供了一个叫做tmpl_context的东西,所以你只需要简单地订阅一个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 }

撰写回答