菜单、json响应或类似的插件结构。
betahaus.viewcomponent的Python项目详细描述
betahaus.viewcomponent自述文件
web页面中可重用的组件使它们变得更加有趣和值得编写。 这个包的目标是使它们易于添加、删除和更改。 虽然它可以在普通的webapp中使用,但使用它可能更有趣 其他人会扩展或改变的东西,如框架。
它的目的是灵活、易于适应,而不是成为解决一切问题的完美方案。
基本示例-添加徽标
首先,创建一个返回html标记的方法。 我们还需要装饰这个方法。 va positional参数是一个viewaction-我们可以忽略它 在本例中。
frombetahaus.viewcomponentimportview_action@view_action('stuff','logo')deflogo_tag(context,request,va):return'<img src="img.png" />'
当您运行存在此代码的config.scan('your-apps-name')时, 它将创建一个名为"stuff"的viewgroup,它有一个viewAction 称为"logo"。
您可以选择使用config对象的指令。 在这种情况下,您需要包含 betahaus.viewcomponent 。
#Code in your packagedeflogo_tag(context,request,va):return'<img src="img.png" />'defincludeme(config):config.add_view_action(logo_tag,'stuff','logo')
viewgroup是一个有序的类似dict的实用程序,它可以跟踪viewactions。
如果要获取视图组的结果,只需执行以下操作:
frombetahaus.viewcomponentimportrender_view_grouprender_view_group(context,request,'stuff')
由于此视图组中没有其他内容,因此将只返回徽标标记。
要仅获取单个viewAction的结果,可以调用render_view_action:
frombetahaus.viewcomponentimportrender_view_actionrender_view_action(context,request,'stuff','logo')
另一个例子-构建菜单
所以你有一个网络应用,你想要一个菜单在某处。然后包X,Y和Z 作为插件工作,但他们如何添加到你的菜单? (阅读金字塔文档了解如何创建视图)
首先,让我们创建最小的python视图代码:
frombetahaus.viewcomponentimportrender_view_groupfrompyramid.viewimportview_config@view_config(renderer='some/template.pt')defmain_template(context,request):returndict(render_view_group=render_view_group)
然后模板:
<html><body><ul>${render_view_group(context, request, 'menu')}</ul></body></html>
菜单将是简单的html字符串,每个语句都有一个 <;li>; 。 要归还它们,我们需要修饰的方法。请注意,视图组 菜单 将在填充后立即创建。(decorator中的第一个参数)
frombetahaus.viewcomponentimportview_action@view_action('menu','login')deflogin_link(context,request,va):return'<li><a href="/login">Login</a></li>'@view_action('menu','logout')deflogout_link(context,request,va):return'<li><a href="/logout">Logout</a></li>'@view_action('menu','my_personal_stuff',permission='ViewStuff')defpersonal_link(context,request,va):""" This will only render if user has permission 'ViewStuff'"""return'<li><a href="/my-stuff">My stuff</a></li>'
应用程序启动后,您现在将拥有一个菜单。另外,其他应用也可能以同样的方式添加到其中, 或者删除最初的备选方案。
高级示例-可插入的json呈现程序
用例:从数据库中提取json。有些信息是敏感的 应该只对某些用户可见。其他插件希望能够 将信息附加或更改到json响应。
我们的上下文将是一个模拟用户对象,其中 字段将被视为敏感信息。
classUser(object):userid=""email=""#etc...
首先,为userid和email添加两个视图操作。电子邮件将获得许可 显示机密
frombetahaus.viewcomponentimportview_action@view_action('json','userid')defget_userid(context,request,va,**kw):returngetattr(context,'userid','')@view_action('json','email',permission='Show secret')defget_email(context,request,va,**kw):returngetattr(context,'email','')
其次,让我们注册一个常规视图,它将返回视图组json
frombetahaus.viewcomponentimportview_action@view_action('stuff','logo')deflogo_tag(context,request,va):return'<img src="img.png" />'0
只有当用户/事物请求查看时,才会包括电子邮件 具有"显示机密"权限。 as_type 参数将视图结果呈现为dict,其中键 将是视图操作名称。(本例中为用户和电子邮件) empty_val 指定返回的任何none或空字符串都应替换为此值。 因此,即使userid返回"",该值仍将包括在内。
附加:垫片
当视图操作输出作为字符串连接时,将添加间隔符, 默认行为。这和使用spacer.join([view1,view2,etc])是一样的
奖励:优先级
priority参数设置添加视图操作时的顺序。 优先级是按顺序排列的,因此在20之前调用10。
要求
此软件包目前无法在金字塔之外使用,但它可能是 更改为更通用,只需要基本的zope组件架构。 它还取决于金星,金星将被金字塔抓取。
反馈和功能
这个包的源代码非常小,应该有足够的注释,所以 很容易知道该怎么做。该软件包仍在开发中,但用于 今天的生产服务器。
如果你有建议,批评,反馈,想法-请不要犹豫与我联系 或者在github中添加一个 问题