zope.principalannotation是实现注释zope.security校长Python模块 要清楚,这里主要是提供zope.security.interfaces.IPrincipal接口和注解对象提供的Zope对象。 annotation.interfaces.IAnnotations。
问题在于,主体是在为每一个安全参与(请求或东西)动态创建动态的,非持久对象,所以共同注解的技术,如AttributeAnnotations不能适用于它们。
该软件包提供了主要注解的持久存储,存储由主ID标注,以及从的IPrincipal到IAnnotations适配器。
PrincipalAnnotationUtility
这个包的核心是存储注解为校长,并允许轻松地获得他们的PrincipalAnnotationUtility类。
它提供了IPrincipalAnnotationUtility接口:
>>>从zope.principalannotation.interfaces进口IPrincipalAnnotationUtility
>>>从zope.principalannotation.utility进口PrincipalAnnotationUtility
>>>从zope.interface.verify进口verifyObject
>>> UTIL = PrincipalAnnotationUtility()
>>> verifyObject(IPrincipalAnnotationUtility,UTIL)
真
它提供了三种方法:getAnnotations,getAnnotationsById和hasAnnotations。让我们创建一个测试本金,并检查了这些方法:
>>>从zope.security.testing进口校长
>>> nadako =本金('nadako“)
>>> nadako.id
“nadako”
我们可以检查我们的主要有任何注解。当然,目前没有任何:
>>> util.hasAnnotations(nadako)
假
我们可以使用的主要对象本身IAnnotations对象:
>>> util.getAnnotations(nadako)
或者采用主ID:
>>> util.getAnnotationsById(nadako.id)
让我们的IAnnotations反对我们的本金和它玩:
>>> annots = util.getAnnotations(nadako)
>>>从zope.interface.verify进口verifyObject
>>>从zope.annotation.interfaces进口IAnnotations
>>> verifyObject(IAnnotations,annots)
真
让我们来检查IAnnotation合同:
>>>布尔(annots)
假
>>> annots ['not.here']
回溯(最近通话最后一个):
...
KeyError异常:“not.here”
>>> annots.get('not.here')是无
真
>>> annots.get('not.here',42)
42
请注意,该IAnnotations对象被存储在只有当我们设置一个关键点的实用程序。这是一个简单的优化,让我们不要存储在所有我们要做的就是简单地检查标注presense任何数据。该hasAnnotations方法将存储在一个注解键后返回True:
>>> util.hasAnnotations(nadako)
假
>>> annots ['its.here'] ='一些信息“
>>> util.hasAnnotations(nadako)
真
我们也可以删除现有关键:
>>>德尔annots ['its.here']
但是,我们不能删除的(没有更多)existant的关键:
>>>德尔annots ['its.here']
回溯(最近通话最后一个):
...
KeyError异常:“its.here”
多标注公用事业
试想一下,你的应用有其组件注册表根站点对象(即站点管理器)和对象都有其自己的组件注册表中的一个子站点对象,而该组件注册表有根的组件注册为基地。
在这种情况下,我们希望IAnnotations反对可检索来自更高级别的实用程序的注释。
让我们登记在公用事业根网站并创建一个子网站有自己的IPrincipalAnnotationUtility:
>>>根['util的'] = UTIL
>>> rootsm = root.getSiteManager()
>>> rootsm.registerUtility(UTIL,IPrincipalAnnotationUtility)
>>>从zope.site.folder导入文件夹
>>>从zope.site.site进口LocalSiteManager
>>>子网站=文件夹()
>>>根['子网站'] =子网站
>>> subsm = LocalSiteManager(子网站)
>>> subsm .__ bases__ =(rootsm,)
>>> subsite.setSiteManager(subsm)
>>> util2 = PrincipalAnnotationUtility()
>>>子网站['util2'] = util2
>>> subsm.registerUtility(util2,IPrincipalAnnotationUtility)
现在,让我们创建的IAnnotations的关键,由root工具提供:
>>> annots = util.getAnnotations(nadako)
>>> annots ['root.number'] = 42
子网站程序应该得到注解成功:
>>> annots2 = util2.getAnnotations(nadako)
>>>布尔(annots2)
真
>>> annots2 ['root.number']
42
如果我们有两个在更高级别的注解和更低级别的那些键,低级将具有优先级,但是更高级的也不会被删除或重写:
>>> annots ['another.number'] = 1
>>> annots2 ['another.number'] = 42
>>> annots ['another.number']
1
>>> annots2 ['another.number']
42
如果我们将删除较低级别的密钥,它也不会从较高级别辅助删除:
>>>德尔annots2 ['another.number']
>>> annots ['another.number']
1
>>> annots2 ['another.number']
1
的IPrincipal - > IAnnotations适配器
当然,最不错的功能是,我们可以简单地调整我们的主要目的在于IAnnotations并获得使用记录在zope.annotation包装标准方法的注释。
  >>> annots = IAnnotations(nadako)
  >>> annots
 
  >>> annots ['root.number']
  42
默认情况下,IAnnotation适配器使用当前网站的实用工具:
>>> IAnnotations(nadako)是util.getAnnotations(nadako)
真
>>>从zope.site.hooks进口setSite
>>> setSite(子网站)
>>> IAnnotations(nadako)是util2.getAnnotations(nadako)
真
Howerver,我们可以使用二进制多适配器IAnnotations指定从中获取注释工具的一些上下文对象:
>>>从zope.component进口getMultiAdapter
>>> annots = getMultiAdapter((nadako,根),IAnnotations)
>>> annots是util.getAnnotations(nadako)
真
>>> annots = getMultiAdapter((nadako,子网站),IAnnotations)
>>> annots是util2.getAnnotations(nadako)
真正的
什么在此版本中是新的:
- 在修正特罗韦分类
什么是3.6.1版本,新的:
- 在固定嵌套本地站点管理器安装测试失败。
- 删除依赖。
在zope.container
要求:
- 在Python中
评论没有发现