zope.principalannotation er en Python-modul som implementerer merknader for zope.security rektorer. & Nbsp; For å gjøre det klart, rektor her er objektet som gir zope.security.interfaces.IPrincipal grensesnitt og merknader er objektet som gir Zope. annotation.interfaces.IAnnotations.
Problemet er at rektorer er dynamiske, ikke-persistente objekter som er opprettet på fly for hver sikkerhet deltakelse (forespørsel eller noe), så vanlig merknads teknikker, som AttributeAnnotations kan ikke brukes på dem.
Denne pakken inneholder en vedvarende lagring av prinsipielle merknader, lagring merknader ved rektor ID samt en adapter fra IPrincipal til IAnnotations.
PrincipalAnnotationUtility
Kjernen i denne pakken er PrincipalAnnotationUtility klasse som lagrer merknader for oppdragsgivere og gjør det mulig å få dem lett.
Det gir IPrincipalAnnotationUtility grensesnitt:
>>> Fra zope.principalannotation.interfaces importere IPrincipalAnnotationUtility
>>> Fra zope.principalannotation.utility import PrincipalAnnotationUtility
>>> Fra zope.interface.verify import verifyObject
>>> Util = PrincipalAnnotationUtility ()
>>> VerifyObject (IPrincipalAnnotationUtility, util)
Sann
Det gir tre metoder: getAnnotations, getAnnotationsById og hasAnnotations. La oss lage en testing rektor og sjekke ut disse metodene:
>>> Fra zope.security.testing import Principal
>>> Nadako = Principal ('nadako')
>>> Nadako.id
'Nadako'
Vi kan sjekke om vår oppdragsgiver har noen merknader. Selvfølgelig, det nåværende tidspunkt ikke noen:
>>> util.hasAnnotations (nadako)
False
Vi kan få IAnnotations objekt ved hjelp av rektor objektet selv:
>>> util.getAnnotations (nadako)
Eller ved hjelp av rektor id:
>>> Util.getAnnotationsById (nadako.id)
La oss få IAnnotations objekt for vår rektor og leke med det:
>>> Annots = util.getAnnotations (nadako)
>>> Fra zope.interface.verify import verifyObject
>>> Fra zope.annotation.interfaces import IAnnotations
>>> VerifyObject (IAnnotations, annots)
Sann
La oss sjekke IAnnotation kontrakten:
>>> bool (annots)
False
>>> annots ['not.here']
Traceback (siste samtale sist):
...
KeyError: 'not.here'
>>> Annots.get ('not.here') er None
Sann
>>> Annots.get ('not.here', 42)
42
Legg merke til at IAnnotations objekt blir lagret i verktøyet bare når vi setter en nøkkel for det. Dette er en enkel optimering som tillater oss ikke å lagre alle data når alt vi gjør er ganske enkelt å sjekke for tilstedeværelse av merknader. Den hasAnnotations metoden vil returnere Sann etter lagring en nøkkel i merknadene:
>>> util.hasAnnotations (nadako)
False
>>> annots ['its.here'] = 'litt info'
>>> util.hasAnnotations (nadako)
Sann
Vi kan også slette den eksisterende nøkkelen:
>>> Del annots ['its.here']
Men vi kan ikke slette nøkkelen som er (ikke mer)-eksisterende:
>>> Del annots ['its.here']
Traceback (siste samtale sist):
...
KeyError: 'its.here'
Multiple merknads verktøy
Tenk deg at din søknad har en rot nettstedet objekt med sin komponent registeret (aka site manager), og at objektet har en sub-site objekt med sin egen komponent registret, og denne komponenten registeret har root sin komponent registret som sin base.
I så fall vil vi IAnnotations objekt til å være tilgjengelig for å hente kommentarer fra høyere nivå verktøy.
La oss registrere vår verktøyet i roten området og skape en sub-site med sin egen IPrincipalAnnotationUtility:
>>> Root ['util'] = util
>>> Rootsm = root.getSiteManager ()
>>> Rootsm.registerUtility (util, IPrincipalAnnotationUtility)
>>> Fra zope.site.folder import Folder
>>> Fra zope.site.site import LocalSiteManager
>>> Sekundært = Mappe ()
>>> Root ['sekundært'] = sekundært
>>> Subsm = LocalSiteManager (sekundært)
>>> Subsm .__ bases__ = (rootsm,)
>>> Subsite.setSiteManager (subsm)
>>> Util2 = PrincipalAnnotationUtility ()
>>> Sekundært ['util2'] = util2
>>> Subsm.registerUtility (util2, IPrincipalAnnotationUtility)
Nå, la oss opprette en nøkkel i IAnnotations, levert av rot verktøyet:
>>> Annots = util.getAnnotations (nadako)
>>> annots ['root.number'] = 42
Det sekundære området verktøyet skal få kommentaren vellykket:
>>> Annots2 = util2.getAnnotations (nadako)
>>> Bool (annots2)
Sann
>>> Annots2 ['root.number']
42
Hvis vi har nøkkelen både i høyere nivå merknader og lavere nivå seg, vil lavere nivå har prioritet, men på høyere nivå vil ikke slettes eller overstyrt:
>>> annots ['another.number'] = 1
>>> Annots2 ['another.number'] = 42
>>> annots ['another.number']
1
>>> Annots2 ['another.number']
42
Hvis vi vil slette nøkkelen fra lavere nivå, vil det ikke bli slettet fra et høyere nivå verktøyet:
>>> Del annots2 ['another.number']
>>> annots ['another.number']
1
>>> Annots2 ['another.number']
1
IPrincipal -> IAnnotations adapter
Selvfølgelig er det mest fin funksjon som vi kan rett og slett tilpasse vår hovedformål å IAnnotations og få disse merknadene som bruker standard måte dokumentert i zope.annotation pakken.
& Nbsp; >>> annots = IAnnotations (nadako)
& Nbsp; >>> annots
& Nbsp;
& Nbsp; >>> annots ['root.number']
& Nbsp; 42
Som standard bruker den IAnnotation adapter gjeldende område nytte:
>>> IAnnotations (nadako) er util.getAnnotations (nadako)
Sann
>>> Fra zope.site.hooks import setSite
>>> SetSite (sekundært)
>>> IAnnotations (nadako) er util2.getAnnotations (nadako)
Sann
Howerver, kan vi bruke et binært multi-adapter til IAnnotations å angi noen sammenheng objekt for å få merknader verktøyet:
>>> Fra zope.component import getMultiAdapter
>>> Annots = getMultiAdapter ((nadako, root), IAnnotations)
>>> Annots er util.getAnnotations (nadako)
Sann
>>> Annots = getMultiAdapter ((nadako, sekundært), IAnnotations)
>>> Annots er util2.getAnnotations (nadako)
True
Hva er nytt i denne utgaven:.
- Korrigerte Trove klassifiserere
Hva er nytt i versjon 3.6.1:
- Fast en test svikt i nestet lokal site manager oppsett .
- Fjernet avhengighet zope.container.
Krav :
- Python
Kommentarer ikke funnet