zope.principalannotation to moduł Pythona, który implementuje adnotacji dla zleceniodawców zope.security. & Nbsp; Aby było jasne, tu jest głównym obiektem, który zapewnia interfejs zope.security.interfaces.IPrincipal i adnotacji jest przedmiotem świadczenia Zope. annotation.interfaces.IAnnotations.
Problemem jest to, że dyrektorzy są dynamiczne, nietrwałe obiekty tworzone w locie dla każdego udziału bezpieczeństwa (żądanie lub coś), więc techniki wspólnego komentowania, jak AttributeAnnotations nie można stosować do nich.
Pakiet ten zapewnia trwały pojemnik do przechowywania podstawowych adnotacji, przechowywanie notatek przez głównego ID oraz adapter z IPrincipal do IAnnotations.
PrincipalAnnotationUtility
Rdzeniem tego pakietu jest klasa PrincipalAnnotationUtility przechowująca adnotacji dla zleceniodawców i pozwala je z łatwością.
Zapewnia interfejs IPrincipalAnnotationUtility:
>>> Z zope.principalannotation.interfaces importować IPrincipalAnnotationUtility
>>> Z zope.principalannotation.utility importu PrincipalAnnotationUtility
>>> Z zope.interface.verify importu verifyObject
>>> Util = PrincipalAnnotationUtility ()
>>> VerifyObject (IPrincipalAnnotationUtility, util)
Prawdziwy
Zapewnia trzy metody: getAnnotations, getAnnotationsById i hasAnnotations. Stwórzmy testowania głównej i sprawdzić te metody:
>>> Z zope.security.testing importu Principal
>>> Nadako = główny ("nadako")
>>> Nadako.id
"Nadako"
Możemy sprawdzić, czy nasz główny ma żadnych adnotacji. Oczywiście, w tej chwili nie ma żadnych:
>>> util.hasAnnotations (nadako)
Fałszywy
Możemy IAnnotations obiekt przy użyciu głównego sam obiekt:
>>> util.getAnnotations (nadako)
Lub za pomocą głównego id:
>>> Util.getAnnotationsById (nadako.id)
Chodźmy na IAnnotations obiekt dla naszego zleceniodawcy i bawić się z nim:
>>> Koment = util.getAnnotations (nadako)
>>> Z zope.interface.verify importu verifyObject
>>> Z IAnnotations zope.annotation.interfaces przywozowych
>>> VerifyObject (IAnnotations, Koment)
Prawdziwy
Sprawdźmy umowy IAnnotation:
>>> bool (Koment)
Fałszywy
>>> Koment ['not.here']
Traceback (najnowsze połączenie ostatni):
...
KeyError: "not.here"
>>> Annots.get ("not.here") jest brak
Prawdziwy
>>> Annots.get ("not.here ', 42)
42
Zauważ, że obiekt IAnnotations zostanie zapisany w narzędzia tylko wtedy, gdy ustawiony klucz do niego. To jest prosta optymalizacja, która pozwala nam nie przechowuje żadnych danych, kiedy wszystko co robimy jest po prostu sprawdzanie obecnosci adnotacji. Metoda hasAnnotations powróci prawda po zapisaniu w klawisz adnotacji:
>>> util.hasAnnotations (nadako)
Fałszywy
>>> Koment ['its.here'] = 'pewne informacje "
>>> util.hasAnnotations (nadako)
Prawdziwy
Możemy też usunąć istniejący klucz:
>>> Del Koment ['its.here']
Ale nie możemy usunąć klucz, który jest (nie więcej) istnial:
>>> Del Koment ['its.here']
Traceback (najnowsze połączenie ostatni):
...
KeyError: "its.here"
Narzędzia Wiele adnotacji
Wyobraź sobie, że Twoja aplikacja posiada stronę obiektu głównego z jego komponentów rejestru (aka kierownik budowy), a obiekt ma obiekt podstrony z własnym rejestrze komponentów i rejestr ten składnik ma rejestru części korzenia jako swojej bazy.
W tym przypadku chcemy, IAnnotations obiekt będzie dostępny do pobrania adnotacje z narzędzi wyższego poziomu.
Miejmy zarejestruj nasze narzędzia w miejscu głównego i utworzyć podstrony z własnym IPrincipalAnnotationUtility:
>>> Główny ["util '] = util
>>> Rootsm = root.getSiteManager ()
>>> Rootsm.registerUtility (util, IPrincipalAnnotationUtility)
>>> Folder z zope.site.folder importu
>>> Z zope.site.site importu LocalSiteManager
>>> Podstrona = Folder ()
>>> Główny ["podstrona '] = podwitrynę
>>> Subsm = LocalSiteManager (podstrona)
>>> Subsm .__ bases__ = (rootsm,)
>>> Subsite.setSiteManager (subsm)
>>> Util2 = PrincipalAnnotationUtility ()
>>> Podstrona ['util2'] = util2
>>> Subsm.registerUtility (util2, IPrincipalAnnotationUtility)
Teraz stwórzmy klucz w IAnnotations, dostarczone przez narzędzia głównego:
>>> Koment = util.getAnnotations (nadako)
>>> Koment ['root.number'] = 42
Narzędzie podstrona powinna uzyskać adnotację powodzeniem:
>>> Annots2 = util2.getAnnotations (nadako)
>>> Bool (annots2)
Prawdziwy
>>> Annots2 ['root.number']
42
Jeśli mamy klucz zarówno w adnotacjach wyższego szczebla i jedynek niższego szczebla, niższego poziomu mają pierwszeństwo, ale na wyższym poziomie nie zostaną usunięte lub nadpisane:
>>> Koment ['another.number'] = 1
>>> Annots2 ['another.number'] = 42
>>> Koment ['another.number']
1
>>> Annots2 ['another.number']
42
Jeśli będziemy usuwać klucz z niższego poziomu, nie zostaną usunięte z narzędzia wyższego poziomu:
>>> Del annots2 ['another.number']
>>> Koment ['another.number']
1
>>> Annots2 ['another.number']
1
IPrincipal -> IAnnotations Adapter
Oczywiście, najbardziej miłą cechą jest to, że możemy po prostu dostosować się do naszego głównego obiektu i dostać te IAnnotations adnotacji przy użyciu standardowego sposobu opisanego w pakiecie zope.annotation.
& Nbsp; >>> Koment = IAnnotations (nadako)
& Nbsp; >>> Koment
& Nbsp;
& Nbsp; >>> Koment ['root.number']
& Nbsp; 42
Domyślnie adapter IAnnotation wykorzystuje narzędzia bieżącego witryny:
>>> IAnnotations (nadako) jest util.getAnnotations (nadako)
Prawdziwy
>>> Z zope.site.hooks importu setSite
>>> SetSite (podstrona)
>>> IAnnotations (nadako) jest util2.getAnnotations (nadako)
Prawdziwy
Howerver, możemy użyć binarny multi-adapter do IAnnotations określić jakiś obiekt kontekstowe, z którego można dostać narzędzia adnotacji:
>>> Z zope.component importu getMultiAdapter
>>> Koment = getMultiAdapter ((nadako, korzeń), IAnnotations)
>>> Koment jest util.getAnnotations (nadako)
Prawdziwy
>>> Koment = getMultiAdapter ((nadako, podwitryna), IAnnotations)
>>> Koment jest util2.getAnnotations (nadako)
True
Co nowego w tym wydaniu:.
- Poprawiono klasyfikatorów Trove
Co nowego w wersji 3.6.1:
- Poprawiono Usterka w zagnieżdżonych konfiguracji lokalnych kierownik budowy .
- Usunięto zależność od zope.container.
Wymagania :
- Python
Komentarze nie znaleziono