Pyramid中的模板上下文等价物(pylons用户)
在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 }