repoze.bfg的Zope 3 "内容提供者"的类似物
项目描述
repoze.bfg.viewgroup
repoze.bfg.viewgroup是repoze.bfg的一个扩展,它允许在ZCML中进行bfg:viewgroup声明,其行为类似于bfg:view,因为它会导致bfg视图注册。然而,与“常规”的bfg:view注册不同,bfg:viewgroup注册引用了一个或多个其他bfg视图(通过名称、接口和请求类型进行匹配)。当调用bfg:viewgroup时(无论是通过遍历还是通过程序性视图执行),视图组将返回一个响应,将所有引用的视图渲染组合成一个单独的主体。
此包主要是应一些喜欢使用Zope 3“内容提供者”和“视图小部件”的人的要求而制作的,尽管它的功能略少,因为bfg视图本身通常不包含接口(它们只是可调用的),所以您不能将视图组注册到视图接口。
请注意,repoze.viewgroup的作者不同意其基于的概念;对他来说,直接在视图中完成工作似乎更简单、更容易理解,而不需要所有这些愚蠢的机制(这些文档尤其难以编写,因为它们完全自引用,这是愚蠢的机制的明确迹象,所以如果我在解释上遇到困难,请原谅我)。这主要只是一个概念证明,尽管是经过测试且功能齐全的。
安装
使用setuptools安装,例如(在虚拟环境中)
$ easy_install -i http://dist.repoze.org/lemonade/dev/simple \ repoze.bfg.viewgroup
用法
要使用视图组,您必须
创建一个ZCML注册,该注册用于注册视图组。
可以通过正常URL遍历调用视图组,就像普通视图一样 - 或者 - 使用provider API,通过视图组名称将内容注入到模板中。
ZCML注册
通过bfg:viewgroup指令在ZCML中创建一个bfg:viewgroup注册
<bfg:viewgroup name="tabs_group" viewnames="login_tab content_tab" for=".interfaces.ISite" />
该指令的组成属性包括
- name – 通过遍历或程序性视图执行可以找到视图组的名称
此属性与bfg:view指令中的name属性具有相同的意义。
- viewnames – 在渲染此视图组时将渲染的视图名称(按渲染顺序),名称之间用空格分隔
。每个名称应引用ZCML中其他地方定义的视图名称。
- for – 此视图注册的“模型”接口
此属性与其在bfg:view指令中的对应属性具有相同的意义。
for参数是可选的;默认值为None。名称参数也是可选的。默认值为空字符串(表示默认视图)。
使用具有name和for的视图组注册将与具有相同参数的视图注册冲突,因此最好将视图组名称与视图名称区分开来。
视图组可以按需在viewname参数中引用另一个视图组(尽管这是不合理的)。
视图组渲染时会发生什么
当视图组被渲染时,它会尝试渲染它引用的每个组成视图(通过viewnames)。如果单个组成视图由于权限问题无法渲染,则会跳过。如果组成视图无法渲染,因为找不到它,则会引发ValueError。视图组的渲染是视图组引用的所有允许视图的简单连接。
Provider辅助工具
为希望在模板内渲染视图组的人提供了一个名为repoze.bfg.viewgroup.group.Provider的辅助类。可以构造一个Provider实例并将其传递到模板渲染中,以便可以使用类似于Zope 3中provider:表达式类型的语法。例如,此视图可能会渲染一个模板
from repoze.bfg.view import bfg_view @bfg_view(template='templates/mytemplate.pt') def myview(context, request): from repoze.bfg.viewgroup.group import Provider provider = Provider(context, request) return {'provider':provider}
正在渲染的模板可以使用provider通过传递视图或视图组名称来“填充插槽”,例如
<html> <head> <span tal:replace="structure provider('headgroup')/> </head> <body>Hello!</body> </html>
传递给provider的名称应是一个bfg视图名称或bfg视图组名称。
报告错误/开发版本
访问http://bugs.repoze.org来报告错误。访问http://svn.repoze.org来下载开发版本或标记版本。
更改
0.3 (2010-06-15)
与BFG 1.2兼容;第一个PyPI版本。
0.2
对即将推出的BFG版本的支持(该版本不需要zope.security,所以我们也不需要)。
0.1
初始版本。