跳转到主要内容

基于zope.pagetemplate的Grok页面模板组件

项目描述

简介

megrok.pagetemplate 是位于 zope.pagetemplate 包之上的一个薄薄的 Grok 层。它允许开发人员使用 Grok 组件注册 IPageTemplate 组件。语法旨在非常简单易读。 megrok.pagetemplate 只提供了一个名为 PageTemplate 的组件,并使用基本的 grokcore.view 指令:nameviewcontextlayer。为了使其更加简单直接,它使用 grokcore.view 模板注册表来注册与 pagetemplate 组件关联的模板文件。

入门指南

首先,我们导入依赖项

>>> import grokcore.view as view
>>> import megrok.pagetemplate as pt
>>> from grokcore.component.testing import grok, grok_component

一个完整且自解释的示例

要开始编写代码,让我们解释一下 PageTemplate 组件背后的概念。显示通常由一个专门的组件处理:视图。视图是一个多适配器,适配上下文和请求。它提供了一个渲染方法(通常是 __call__)。如果我们想自定义视图,我们需要子类化它或覆盖它。在两种情况下,我们都会得到一个新的视图,并且可能需要复制一些代码。

PageTemplate 组件允许你在渲染级别进行交互。这个新组件实现了 zope.pagetemplate IPageTemplate 接口,并注册为多适配器,适配视图和层(请求类型)。这个 PageTemplate 可以命名,以提供更多的自定义选项。

让我们构建一个具体的示例来理解这个概念。首先,我们需要一个上下文。我们的用例将为可爱的动物——猛犸象提供不同的渲染。首先,让我们创建我们的猛犸象和一个简单的视图来显示它

>>> from zope.component import getMultiAdapter
>>> from zope.pagetemplate.interfaces import IPageTemplate

>>> class Mammoth(view.Context):
...     """A furry pachyderm
...     """
...     nickname = u"Grokky"


>>> class MammothView(view.View):
...     """A view that display a mammoth
...     """
...     view.context(Mammoth)
...
...     def update(self):
...         self.mammoth_name = u"My name is %s." % self.context.nickname
...
...     def render(self):
...         template = getMultiAdapter((self, self.request), IPageTemplate)
...         return template()

>>> grok_component('my_mammoth_view', MammothView)
True

如我们所见,视图的渲染方法是调用 PageTemplate 组件。它将渲染由注册表查找找到的模板。

为了完整起见,这里我们将提供一个 IPageTemplate 组件

>>> class NakedMammoth(pt.PageTemplate):
...     """A mammoth shown in its simpliest apparel
...     """
...     pt.view(MammothView)
...     template = view.PageTemplate(
...        '<span tal:replace="view/mammoth_name" /> I am naked !'
...        )

>>> grok_component('NakedMammoth', NakedMammoth)
True

现在我们的模板已经注册,我们可以尝试调用视图并渲染它

>>> from zope.publisher.browser import TestRequest
>>> request = TestRequest()
>>> mammoth = Mammoth()

>>> mnv = getMultiAdapter((mammoth, request), name="mammothview")
>>> print mnv()
My name is Grokky. I am naked !
<BLANKLINE>

我们的猛犸象按预期渲染。尽管如此,我们不能让这种生物裸露着离开。它需要一些皮毛来面对西伯利亚冬天的严寒。

为了自定义我们的猛犸象渲染,将其从裸露变为毛茸茸的,我们将在上面注册我们的新“毛茸茸”模板组件

>>> from zope.publisher.interfaces import browser
>>> class IFurryLayer(browser.IDefaultBrowserLayer):
...     """A layer for furry animals.
...     """
>>> furry_request = TestRequest(skin=IFurryLayer)


>>> class FurryMammoth(pt.PageTemplate):
...     """A mammoth shown in its simpliest apparel
...     """
...     pt.view(MammothView)
...     pt.layer(IFurryLayer)
...     template = view.PageTemplate(
...        '<span tal:replace="view/mammoth_name" /> I am all furry !'
...        )

>>> grok_component('FurryMammoth', FurryMammoth)
True

我们的新模板已注册,我们现在能够测试一切是否按预期工作。使用新的皮肤,我们的猛犸象现在应该是毛茸茸的

>>> mfv = getMultiAdapter((mammoth, furry_request), name="mammothview")
>>> print mfv()
My name is Grokky. I am all furry !
<BLANKLINE>

注意 - 我们可以使用一个非常方便的函数来查询我们的组件

>>> print pt.getPageTemplate(mfv, furry_request)
<megrok.pagetemplate.components.ViewPageTemplate object at ...>

太棒了。我们的猛犸象现在完全准备好面对寒冷。尽管如此,让我们确保最简单的请求会从动物身上剃掉它温暖的长发

>>> mnv = getMultiAdapter((mammoth, request), name="mammothview")
>>> print mnv()
My name is Grokky. I am naked !
<BLANKLINE>

这行得通。享受吧!

变更日志

0.7 (2011-01-31)

  • 我们现在使用 grokcore.view 包的最新更改和独立的模板解析器,以避免重新实现整个机制。

  • 更新为与 Grok 1.3+ 兼容

0.6 (2010-11-10)

  • 针对最新的 grokcore 包进行了测试。

  • 删除了 grokcore.viewletzope.testing 的依赖关系。

0.5 (2010-05-27)

  • 清理了代码,以遵守严格的 pep8。删除了未使用的导入。

  • 针对 Grok 1.1 进行了测试。

0.4.1 (2010-02-22)

  • 更新了 MANIFEST,以便测试模块的“templates”文件夹现在是源发布的一部分(因此测试现在可以正确运行)。

0.4 (2010-02-21)

  • 清理了依赖关系,以去除所有 zope.app 艺术品。

  • 清理了导入和测试。

0.3 - Beta3 发布

  • 修改了测试,以直接从包 megrok.pagetemplate 本身导入所有所需的指令。[trollfot]

  • 添加了一个方便的函数 getPageTemplate 来查询页面模板组件。

0.2 - Beta2 发布

  • megrok.pagetemplate 已升级,以与最新的 grokcore.view(1.12.1)兼容。已纠正测试,CodeView 已消失。[trollfot]

0.1 - Beta1 发布

  • 首次发布 [trollfot]

项目详情


下载文件

下载适用于您平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。

源代码分发

megrok.pagetemplate-0.7.tar.gz (8.2 kB 查看哈希值)

源代码

由以下机构支持

AWSAWS云计算和安全赞助商DatadogDatadog监控FastlyFastlyCDNGoogleGoogle下载分析MicrosoftMicrosoftPSF赞助商PingdomPingdom监控SentrySentry错误日志StatusPageStatusPage状态页面