金字塔中模板上下文的等价物是什么?
金字塔中的IBeforeRender活动是否与此有关?我已经阅读了官方文档,但很难理解IBeforeRender事件究竟是什么。
答案 0 :(得分:11)
Pyramid已经在其Request对象上提供了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 }
答案 1 :(得分:6)
如果你想要一些“全球包”,你可以填充每个模板可用的变量,那么关于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
答案 2 :(得分:2)
在我看来,上述解决方案并不完全复制Pylons模板上下文的行为。如果在Pylons中呈现页面请求并向上下文a
添加一些值c
,则可以在模板中将其作为c.a
访问。但是,如果有人提出另一个请求,则此键/值将被删除。
上面的金字塔解决方案显示了另一种行为。键/值c.a
将保留在模板上下文中。有时,这是不希望的。有什么建议可以解决这个差异吗?
答案 3 :(得分:1)
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>
答案 4 :(得分:0)
来自 Pyramid Cookbook 的Pylons magic globals部分:
Pylons有几个神奇的全局变量包含状态数据 当前的要求。这是最接近的金字塔等价物:
(...)
pylons.tmpl_context
请求本地数据的临时对象,通常用于传递可变数据 到模板。在金字塔中,你返回变量的字母并让它 渲染器将它们应用于模板。或者您可以渲染模板 你自己在视图代码。
如果视图是方法,您还可以设置实例变量。风景 实例在模板中显示为
view
。有两个主要用途 为了这。一,为网站模板设置变量 否则必须在每个回归词典中。二,对于变量 特定于HTML呈现,当视图同时注册时 HTML呈现器和非HTML呈现器(例如,JSON)。Pyramid的端口为&#34; tmpl_context&#34;在
request.tmpl_context
, 这在模板中显示为c
。然而,它从未流行过 Pyramid-Pylons用户并不再记录。
答案 5 :(得分:-1)
如果您正在寻找一个全球字典来方便地将变量传回去在模板和视图之间,使用pyramid.request.TemplateContext
在模板页面上:
<%!
from pyramid.request import TemplateContext as c
c.foo = 123
%>
然后,您可以通过在视图中以相同的方式导入TemplateContext来访问变量:
from pyramid.request import TemplateContext as c
这或多或少相当于pylons中的tmpl_context。