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:それは3つのメソッドを提供します。のは、テストのプリンシパルを作成し、これらの方法を確認してみましょう:
>>> 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契約を確認してみましょう:
>>> BOOL(annots)
偽
>>> annots ['not.here']
トレースバック(最新の呼び出し最後):
...
はKeyError: 'not.here」
>>> annots.get( 'not.here')はNoneです
真
>>> 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でキーを作成してみましょう:
>>> annotsの=のutil.getAnnotations(nadako)
>>> annots ['root.number'] = 42
サブサイトのユーティリティは正常注釈を取得する必要があります:
>>> annots2 = util2.getAnnotations(nadako)
>>> BOOL(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パッケージに記載されて標準的な方法を用いて、それらの注釈を得ることができるということです。
&NBSP; >>> annots = IAnnotations(nadako)
&NBSP; >>> annots
&NBSP;
&NBSP; >>> annots ['root.number']
&NBSP; 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ます。
コメントが見つかりません