【问题标题】:Equivalent of template context in Pyramid (pylons user)Pyramid 中模板上下文的等价物(pylons 用户)
【发布时间】:2023-03-29 03:15:01
【问题描述】:

Pyramid 中的模板上下文等价物是什么?

金字塔中的 IBeforeRender 事件与此有关吗?我浏览了官方文档,但很难理解 IBeforeRender 事件到底是什么。

【问题讨论】:

  • 奇怪的问题...IBeforeRender 与模板上下文有什么关系?
  • 抱歉,我认为它可能相当于 Pyramid 中的 Template Conext,但我想那是另一回事。
  • 在 Pylons 邮件列表上请求 Pylons 人员的帮助。
  • 并请合理的主题 - 这个主题太笼统,对引起注意没有多大帮助!

标签: python pylons pyramid


【解决方案1】:

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 }

【讨论】:

  • Request.tmpl_context 不再记录在案,它已经在模板中显示为c - 请参阅我的answer
【解决方案2】:

如果您希望有一些“全局包”,您可以在其中填充可用于每个模板的变量,那么您关于 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 中是 g。这与每个请求的上下文 tmpl_context/c 不同。
  • 您的回复非常有用。非常感谢。
【解决方案3】:

在我看来,上面的解决方案并没有完全复制 Pylons 模板上下文的行为。如果在 Pylons 中呈现页面请求并将一些值 a 添加到上下文 c,则可以在模板中以 c.a 访问它。但是,如果有人呈现另一个请求,则此键/值将被丢弃。

上面的金字塔解决方案显示了另一种行为。键/值c.a 将保留在模板上下文中。有时,这是不希望的。有什么建议可以解决这个差异吗?

【讨论】:

  • 是的,而不是使用 global 事件 BeforeRender 将请求特定的变量传递给渲染器或在直接渲染您的响应时使用它们。 在 Pyramid 中,您返回一个变量字典并让渲染器将它们应用到模板。或者您可以自己在视图代码中呈现模板。 – 来自 Pyramid CookbookPylons magic globals 部分。
【解决方案4】:

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'}

还有问候.mako:

<html>
<head>
    <title>Greetings</title>
</head>
<body>
    <h1>Greetings</h1>
    <p>Hello ${name}!</p>
</body>
</html>

【讨论】:

    【解决方案5】:

    来自Pyramid CookbookPylons magic globals部分:

    Pylons 有几个神奇的全局变量,其中包含 当前请求。以下是最接近的 Pyramid 等价物:

    (...)

    pylons.tmpl_context

    请求本地数据的临时对象,通常用于传递变量 到模板。在 Pyramid 中,您返回一个变量字典并让 渲染器将​​它们应用于模板。或者你可以渲染一个模板 自己在查看代码。

    如果视图是一个方法,你也可以设置实例变量。风景 实例在模板中显示为view。有两个主要用途 cses 为了这。一,为站点模板设置变量 否则必须在每个返回字典中。二,对于变量是 特定于 HTML 渲染,当视图注册到 HTML 渲染器和非 HTML 渲染器(例如 JSON)。

    Pyramid 在request.tmpl_context 处确实有一个“tmpl_context”端口, 它在模板中显示为c。然而,它从来没有流行起来 Pyramid-Pylons 用户,不再记录。

    【讨论】:

      【解决方案6】:

      如果您正在寻找一个全局字典以方便地在模板和视图之间来回传递变量,请使用 pyramid.request.TemplateContext

      在模板页面上:

      <%!
          from pyramid.request import TemplateContext as c
          c.foo = 123
      %>
      

      然后你可以通过在你的视图中导入 TemplateContext 来访问变量:

      from pyramid.request import TemplateContext as c
      

      这应该或多或少相当于 pylons 中的 tmpl_context。

      【讨论】:

        猜你喜欢
        • 2021-12-15
        • 2012-03-02
        • 2019-06-21
        • 1970-01-01
        • 2011-10-19
        • 2012-08-10
        • 1970-01-01
        • 1970-01-01
        • 2011-01-10
        相关资源
        最近更新 更多