Pyramid 中的模板上下文等价物是什么?
金字塔中的 IBeforeRender 事件与此有关吗?我已经阅读了官方文档,但很难理解 IBeforeRender 事件到底是什么。
Pyramid 已经tmpl_context
在其 Request 对象上提供了一个,因此您只需订阅一个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 }
相反,如果您希望有一些“全局包”,您可以在其中填充可用于每个模板的变量,那么您关于 IBeforeRender 的问题是合适的。
from pyramid.events import subscriber
from pyramid.events import BeforeRender
@subscriber(BeforeRender)
def add_global(event):
event['name'] = 'Pyramid Developer'
在设置配置器时,还有另一种添加全局变量的方法。您可以在以下位置查看完整信息:http ://docs.pylonsproject.org/projects/pyramid/en/latest/narr/hooks.html#using-the-before-render-event
在我看来,上面的解决方案并没有完全复制 Pylons 模板上下文的行为。如果在 Pylons 中呈现页面请求a
并向上下文添加一些值c
,则可以在模板中以c.a
. 但是,如果有人呈现另一个请求,则此键/值将被删除。
上面的金字塔解决方案显示了另一种行为。键/值c.a
将保留在模板上下文中。有时,这是不希望的。有什么建议可以解决这种差异吗?
Pyramid 并没有真正向开发人员公开“模板上下文”(尽管它在 Pyramid 的各种模板引擎绑定内部使用)。
通常,如果您想将某些内容填充到“c”中以在模板中使用,您只需将其作为关键字参数传递给 render_to_response() 调用或作为您使用预定义渲染器返回的 dict 的一部分。
因此,要执行类似于http://pylonsbook.com/en/1.1/using-view-templates.html#using-the-template-context-c-global的操作,您可以:
@view_config(renderer="greeting.mako")
def index(request):
return {'name': 'Pyramid Developer'}
和 greeting.mako :
<html>
<head>
<title>Greetings</title>
</head>
<body>
<h1>Greetings</h1>
<p>Hello ${name}!</p>
</body>
</html>
来自Pyramid Cookbook的Pylons magic globals部分:
Pylons 有几个神奇的全局变量,其中包含当前请求的状态数据。以下是最接近的 Pyramid 等价物:
(...)
pylons.tmpl_context
请求本地数据的临时对象,通常用于将变量传递给模板。在 Pyramid 中,您返回一个变量字典并让渲染器将它们应用到模板。或者您可以在视图代码中自己渲染模板。
如果视图是方法,还可以设置实例变量。
view
视图实例在模板中是可见的。为此有两个主要用途。一,为站点模板设置变量,否则必须在每个返回字典中。第二,对于特定于 HTML 渲染的变量,当视图同时注册到 HTML 渲染器和非 HTML 渲染器(例如,JSON)时。Pyramid 确实有一个“tmpl_context”端口
request.tmpl_context
,它在模板中可见为c
. 然而,它从未在 Pyramid-Pylons 用户中流行起来,也不再被记录在案。
如果您正在寻找一个全局字典以方便地在模板和视图之间来回传递变量,请使用 pyramid.request.TemplateContext
在模板页面上:
<%!
from pyramid.request import TemplateContext as c
c.foo = 123
%>
然后,您可以通过在视图中导入 TemplateContext 以相同的方式访问该变量:
from pyramid.request import TemplateContext as c
这应该或多或少相当于 pylons 中的 tmpl_context。