Zope浏览器页面的Grok-like配置
项目描述
此软件包提供了为 Zope 编写浏览器页面并在 Python 中直接注册这些页面(不使用 ZCML)的支持。
设置 grokcore.view
此软件包的设置基本上与grokcore.component软件包类似,请参阅其文档以获取详细信息。您需要的附加 ZCML 行如下
<include package="grokcore.view" file="meta.zcml" /> <include package="grokcore.view" />
将第一行放在根 ZCML 文件顶部附近(但低于包含grokcore.component配置的行),将第二行放在其他依赖项包含旁边。
示例
简单的浏览器页面
浏览器页面通过继承基类 grokcore.view.View 来实现。至少,一个浏览器页面必须具有
一个关联的模板(或实现 render 方法以进行直接控制)
一个已注册为视图的上下文
一个名称(如果未明确指定,则为小写字母的类名)。
不使用模板而只输出一些计算数据的浏览器页面也继承自基类 grokcore.view.View。至少,此类视图必须具有
一个 render() 方法
一个已注册为视图的上下文
一个名称(如果未明确指定,则为小写字母的类名)。
例如,以下类定义了一个注册给所有对象的视图,简单地打印“Hello World!”
import grokcore.view import zope.interface class Hello(grokcore.view.View): grokcore.view.context(zope.interface.Interface) def render(self): self.response.setHeader("Content-Type", "text/plain") return "Hello World!"
这里我们使用了隐式名称功能。此类将作为所有对象的 hello 视图可用。例如,您可以通过类似以下 URL 调用它
https://127.0.0.1/some/obj/hello
我们也可以明确写出
class Hello(grokcore.view.View): grokcore.view.context(zope.interface.Interface) grokcore.view.name('hello') ...
带模板的浏览器页面
当然,更常见的情况是视图应该渲染 HTML,您可以使用某种模板引擎来构建。 grokcore.view 集成了 Zope 的 PageTemplate 引擎的支持。按照惯例,PageTemplate 模板以 .pt 扩展名结尾。
因此,让我们让 Hello 视图渲染 HTML 而不是纯文本,我们删除类中的 render() 方法,而是创建一个模板,例如如下
<html> <body> <p>Hello <span tal:replace="request/principal/title" />!</p> </body> </html>
此模板将向登录用户显示他们的真实姓名。
此类模板使用的页面是 grokcore.view.View 的子类
import grokcore.view import zope.interface class Hello(grokcore.view.View): grokcore.view.context(zope.interface.Interface)
为了将模板与视图关联起来,我们必须将其放在特定位置。假设上面的 Hello 视图类在 app.py 模块中。然后我们在它旁边创建一个 app_templates 目录,并将模板文件放在那里(该目录的名称可以用 templatedir 指令自定义,见下文)。文件名可以是任何名称,只要扩展名是 .pt。然而,我们还可以在此处利用一个约定。如果我们按类名命名模板(除了小写字母),则模板和类将自动关联。如果不这样做,我们必须在视图类上使用 template 指令明确指定模板文件的名称。
简而言之,如果我们将其命名为 app_templates/hello.pt,它将自动找到。
静态资源
浏览器页面通常需要额外的静态资源,如CSS和JavaScript文件。这些资源可以方便地放置在包含视图代码的包中名为static的目录中。当这个目录存在时,它将自动注册为资源目录。然后,它将作为该包所有视图中的static变量可用,您可以使用如下方式引用该目录中的文件:
<img src="hello.png" tal:attributes="src static/hello.png" />
DirectoryResource
除了非常方便的“静态资源”外,还可以使用更明确配置和灵活的DirectoryResource组件。DirectoryResource组件可以根据层和名称区分资源,并提供一种在单个包中注册资源并在另一个包的视图中使用这些资源的方法。
class FooResource(grokcore.view.DirectoryResource): grokcore.view.path('foo')
或者使用一个显式的名称
class BarResource(grokcore.view.DirectoryResource): grokcore.view.name('bar') grokcore.view.path('bar')
为层注册
class BazResource(grokcore.view.DirectoryResource): grokcore.view.layer(ISomeLayer) grokcore.view.path('baz/qux')
层和皮肤
要定义浏览器层,只需扩展IBrowserRequest接口。
class IGreenLayer(grokcore.view.IBrowserRequest): pass
如果您想定义一个皮肤,只需继承所有应在皮肤中的层接口,并使用skin()指令为层命名。
class IGreenSkin(IGreenLayer, grokcore.view.IDefaultBrowserLayer): grokcore.view.skin('Green')
要将视图放置在层上,只需使用layer指令。
class Hello(grokcore.view.View): grokcore.view.context(zope.interface.Interface) grokcore.view.layer(IGreenLayer) ...
API 概览
基类
- 视图
浏览器页面的基类。使用context指令指定视图的上下文。使用name指令设置视图的名称;如果不使用,视图的名称将是类名的小写字母。您还可以使用template指令指定应与视图关联的模板文件名,以及使用layer指令指定它应位于哪个层上(如果不是默认层)。实现render方法以避免查找模板,并显示调用render方法的返回结果。
视图 API
grokcore.view.View是一个常规的Zope浏览器页面,因此它在外部表现得完全像一个常规浏览器页面。尽管如此,它为使用它作为基类的开发人员提供了一些额外功能。
- 上下文
视图的上下文对象。可以使用视图类上的context指令进行区分。
- 请求
请求对象,通常提供IBrowserRequest。
- 响应
响应对象,通常提供IHTTPResponse。
- 静态
表示包的static目录的目录资源或None(如果在grokking过程中未找到此类目录)。
- redirect(url)
重定向到指定的URL。
- url(obj=None, name=None, data=None)
构建一个URL
如果没有给出任何参数,则构建到视图本身的URL。
如果只提供了obj参数,则构建到该对象的URL。
如果提供了obj和name参数,则构建到对象的URL,并附加name(可能是视图的名称)。
可选的,data可以是一个字典,其内容将作为查询字符串添加到URL中。
开发者实现的方法
- update(**kw)
此方法将在渲染视图关联的模板之前被调用。因此,如果您想为模板预计算值,请实现此方法。您可以将值保存到self(视图对象)中,并通过模板中的view变量稍后访问它们。此方法可以接受任意关键字参数,这些参数从请求值中填充。
- render(**kw)
返回一个编码的8位字符串或一个Unicode字符串。该方法可以接受任意的关键字参数,这些参数将从请求值中填充。如果没有实现,将查找模板目录中的模板。
指令
- templatedir(dirname)
模块级指令,告诉模板机制在哪个目录中查找与特定模块中视图相关联的模板。如果没有使用,则默认为<module_name>_templates。
- template(filename_wo_ext)
类级指令,指定与视图类相关联的模板文件名,不包括文件扩展名。如果没有使用,则默认为类的名称,以小写字母表示。
- layer(layer_interface)
类级指令,定义视图注册的层。如果没有使用,则默认为IDefaultBrowserLayer。
- skin(skin_name)
在层接口上使用的指令,用于使用人类可读的名称(skin_name)注册皮肤。
- path(relative_or_absolute_path)
在目录资源注册中使用的指令,用于指向包含图像、CSS文件等资源的非包目录(层次结构)。
其他
- url(request, obj, name=None, data=None)
生成对象的URL,可以附加一个可选的视图名称。data参数可以是一个字典,其内容将被转换为附加到URL上的查询字符串。
- PageTemplate(template_code)
创建一个内联PageTemplate对象。
- PageTemplateFile(filename)
从文件创建一个PageTemplate对象。
- IBrowserRequest
来自zope.publisher的浏览器请求接口。
- IDefaultBrowserLayer
来自zope.publisher的浏览器组件的默认层。
此外,grokcore.view包公开了grokcore.component和grokcore.security API。
变更
4.0 (2023-02-16)
添加对Python 3.11的支持。
放弃对Python 2.7、3.5和3.6的支持。
3.2 (2022-02-16)
添加对Python 3.7、3.8、3.9和3.10的支持。
放弃对Python 3.4的支持。
更新测试到martian >= 1.5,因此至少需要该版本。
3.1 (2018-06-13)
添加了AfterTraversalEvent,该事件在所有遍历完成后触发。
3.0.3 (2018-01-12)
重新排列测试,以便Travis CI可以捕获所有功能测试。
3.0.2 (2018-01-05)
其他测试修复。
3.0.1 (2018-01-05)
其他测试修复。
3.0 (2018-01-03)
在模板目录grokker中,忽略没有扩展名的目录和文件。
放弃对Python 2.6的支持。
声明支持Python 3.4、3.5和3.6。
2.10.2 (2016-02-02)
更新测试。
2.10.1 (2014-07-29)
修复损坏的MANIFEST.in。
2.10 (2014-07-29)
添加一个辅助程序render_provider,用于查找并渲染给定内容提供者。
2.9 (2014-05-15)
使用环境变量GROK_DISABLE_TEMPLATE_WARNING来禁用模板警告。
grokcore.view.util.url的skin选项现在接受字符串,这些字符串将用作皮肤名称,作为皮肤接口的替代方案。
skin指令现在可以用于只从IRequest继承的接口,而不是IBrowserRequest。
2.8 (2012-12-11)
将skin=[skin component]参数添加到grokcore.view.util.url()函数和grokcore.view.components.View.url方法。这允许在特定皮肤上计算URL。请注意,不会验证计算出的URL实际上是否存在于指定的皮肤上。
2.7 (2012-05-01)
在grokcore.component中使用组件注册API。
当templatedir()指令指向一个不存在的目录时,改进错误信息。(修复launchpad问题680528)。
当组件需要模板但无法找到模板时,改进错误信息(修复Launchpad问题#225855,#242698)。
修复如何查找静态资源的问题。不再使用组件定义的包名作为名称,而是使用定义组件模板的包或基本组件的名称。这是通过在组件上设置一个属性 __static_name__ 来实现的,该属性指定了应使用哪个资源目录。当扩展组件且未重新定义模板时,此修复可以找到缺失的资源。
2.6.1 (2011-06-28)
修复了 zope.browserpage 未正确声明为依赖项的漏洞。
2.6 (2011-06-28)
添加了 ContentProvider 组件。
2.5 (2011-04-04)
修复了一个依赖于旧 zope.testbrowser 行为的测试。
2.4 (2011-03-01)
grok.View 组件可以选择使用 grok.provides 指令,指定组件提供的接口(而不是默认提供 zope.interface.Interface 的视图)。
添加了一个新的 ZCML 指令 ignoreTemplates,允许您配置应忽略的模板文件名模式。指令的 pattern 属性接受与(模板)文件扩展名匹配的正则表达式。
使用 zope 配置动作顺序功能,在尝试关联模板之前,为所有包和模块注册模板。在配置动作顺序中,检查未关联的模板是在非常晚的时候完成的。
在继承 grok.template() 信息时,会查找使用 grok.template() 指令的视图类所在的模块。这允许从其他包继承使用 grok.template() 指令的视图组件。
2.3 (2011-01-04)
为了使用 fanstatic,移除了静态目录 grokker。
2.2 (2010-12-16)
提取一个基模板 grokker,用于关联视图组件的模板。
合并了对全局模板注册表的支持,从而消除了关于“共享”模板目录中未关联模板的冗余警告。
2.1 (2010-11-03)
使用更新后的 Martian 和 grokcore.component。
自定义的 zope 发布现在已从 grok 包移动到 grokcore.view。发布注册是可选的,由 grok 和 grokcore.json 包使用。
将 util 函数 make_checker 从 grok 包移动到 grokcore.view。
2.0 (2010-11-01)
将 view 指令从 grokcore.viewlet 移动到 grokcore.view。
将 IGrokSecurityView 从 grok 移动到 grokcore.view。
修复了 url() 函数在传递空数据字典时的行为。
修复了 url() 方法以接受“状态”和“可信”参数,并将它们传递到响应对象的 redirect 方法。
grokcore.view 不再依赖于 zope.app.testing 和相关包。现在我们使用 zope.app.wsgi.testlayer 来运行功能测试。
使包符合 zope.org 存储库策略。
修复了 launchpad 漏洞 #395061:删除了 default_fallback_to_name 函数。如果需要,可以从 grokcore.security 导入。
grokcore.view 不再依赖于 zope.app.zcmlfiles。我们删除了所有额外的依赖,并修复了一个使用 zope.app.rotterdam 和 zope.app.basicskin 的测试。
回滚了 1.13 分支与目录资源注册相关的更改,使用最新的 ztk 包。
将适用于视图组件的通用方法和属性提取到 components.ViewSupport 混合中。
与新的 Martian (0.13) 和 grokcore.component 2.1 兼容。
测试修复:支持 Windows 路径。
警告现在作为级别为 logging.WARNING 的日志消息发出,到一个名为 grokcore.view 的记录器,其级别为 logging.ERROR。
这意味着默认情况下不再发出任何警告(而错误仍然会出现)。
要恢复警告,请将日志记录器 grokcore.view 的级别降低到 logging.WARNING 或更低。这可以通过Python或通过日志配置文件完成,例如在常规grok项目的.ini文件中。有关详细信息,请参阅Python标准库的 logging 模块。
1.12.1 (2009-09-17)
为了支持 grokcore.viewlet,进行了兼容性修复。
1.12 (2009-09-17)
在Grok的发布信息中使用1.0b1版本的versions.cfg,而不是本地副本;对于所有grokcore包的本地副本维护起来过于困难。
撤销CodeView/View的拆分。拆分的原始原因已被最近关于继承模块级别指令的martain发展所淘汰。同时,拆分的组件使用起来很繁琐,并且Grok 1.0a和1.0b版本之间的变化太大。
视图组件现在将再次像Grok的最新alpha版本那样行为。
CodeView 仍然可以作为 View 的向后兼容别名使用。请将所有对 CodeView 的引用更新为 View。
修复模板注册和视图grokker,以便将使用View作为基类的View和其他组件直接与模板关联,通过在视图类上设置‘template’属性来实现。示例
class MyView(grokcore.view.View): template = grokcore.view.PageTemplate('<p>hello</p>')
这并不完全 正式 支持,但有足够多的人依赖于它并对其进行了文档记录,所以我们不想只是打破它。
1.11 (2009-09-15)
响应属性需要在CodeView中也可用。
1.10 (2009-09-14)
将grokcore.security的版本要求提高到1.2。
将versions.cfg与当前的grok versions.cfg保持一致。
1.9 (2009-07-04)
修复grokcore.formlib所需的更改:允许在视图中使用带有base_method的render()。这允许grokcore.formlib在模板之外还具有render()。
撤销对checkTemplates的更改:对于某些formlib边缘情况,它现在可以再次检测到正确的模板。
1.8 (2009-07-04)
向templatedir指令添加验证器,禁止路径分隔符。
从View中分离出CodeView。View只使用模板,CodeView只使用render()方法。因此,具有render方法的视图必须从CodeView(而不是View)继承(这应该是唯一需要更改的地方)。
向功能测试添加grok.View权限(需要grokcore.security 1.1)
1.7 (2009-05-19)
撤销对zope.container的依赖,重新回到zope.app.container。
1.6 (2009-04-28)
通过更好地利用zope.app.publisher.browser.directoryresource提供的钩点,简化DirectoryResource和DirectoryResourceFactory实现。
1.5 (2009-04-10)
如果不存在‘static’目录,则不注册‘static’资源目录。
通过在__init__中稍微更加防御性,使非grokked视图的实例化成为可能。这使得编写单元测试变得更容易。
1.4 (2009-04-08)
页面模板重新加载现在也适用于宏。修复了 https://bugs.launchpad.net/grok/+bug/162261。
使用zope.container而不是zope.app.container。
在查找模板目录中的模板文件时忽略‘<tpl>.cache’文件。修复了 https://bugs.launchpad.net/grok/+bug/332747
1.3 (2009-01-28)
调整测试以从egg文件中工作,而不仅是从源代码签出,通过避免在目录比较中使用src。
通过使用zope.app.publisher.browser.directoryresource中的钩点来修复DirectoryResource实现的子目录工厂。
更新API接口,包括新的path指令和新的DirectoryResource组件。
1.2 (2008-10-16)
将DirectoryResource类公开为组件,用于将目录注册为资源。这伴随着用于通过相对(相对于模块)或绝对路径指向包含资源的目录的path指令。DirectoryResource组件可以通过名称和层来区分。
1.1 (2008-09-22)
meta.py 模块中的解析器已经被拆分到一个包含视图、模板、皮肤和静态资源解析器的独立模块包中。这允许应用程序仅使用它们需要的解析器(并且可能重新定义其他解析器)。
1.0 (2006-08-07)
在 2008 年 7 月创建 grokcore.view,通过从 Grok 中提取与安全相关的组件、解析器和指令。
项目详情
下载文件
下载适用于您的平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。