zope.principalannotation е Python модул, който въвежда пояснения за zope.security директори & Nbsp;. За да стане ясно, главницата тук е обект, който осигурява 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 внос Principal
>>> Nadako = Principal ("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
>>> От IAnnotations zope.annotation.interfaces внос
>>> VerifyObject (IAnnotations, annots)
Вярно
Да се провери договора IAnnotation:
>>> булев (annots)
Фалшив
>>> annots ['not.here "]
Traceback (последното повикване последната):
...
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 "]
Но ние не можем да изтриете ключ, който е (не повече) съществувам:
>>> Дел annots ['its.here "]
Traceback (последното повикване последната):
...
KeyError: "its.here"
<Силен> Multiple анотация комунални услуги
Представете си, че вашето приложение има корен сайт обект с компонент своя регистър (известен още като мениджър сайт) и този обект е с предмет под-сайт със собствен компонент регистър, както и това, че компонентът регистър има компонент регистър корена като своя база.
В този случай, ние искаме IAnnotations обектът да бъде на разположение, за да изтеглите анотации от по-високо ниво комунални услуги.
Нека да се регистрирате в нашия полезност в главната площадка и да се създаде под-сайт със собствен IPrincipalAnnotationUtility:
>>> Корен ['Util'] = Util
>>> Rootsm = root.getSiteManager ()
>>> Rootsm.registerUtility (Util, IPrincipalAnnotationUtility)
>>> От zope.site.folder Folder внос
>>> От zope.site.site внос LocalSiteManager
>>> Подсайт = Folder ()
>>> Корен ["подобект"] = подсайт
>>> 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)
>>> Булев (annots2)
Вярно
>>> Annots2 ['root.number "]
42
Ако имаме ключа както в анотации по-високо ниво и такива с по-ниско ниво, на по-ниско ниво, ще имат предимство, но по-високо ниво, няма да бъдат изтрити или overriden:
>>> 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)
True
Какво ново в тази версия:.
- поправен находка класификатори
Какво ново във версия 3.6.1:
- Фиксирана недостатъчност тест в вложените настройка местното управление на сайт .
- Премахнато зависимостта от zope.container.
<силни> Изисквания :
- Python
Коментари не е намерена