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中
評論沒有發現