zope.principalannotation là một mô-đun Python mà thực hiện các chú thích cho hiệu trưởng zope.security & nbsp;. Để làm cho nó rõ ràng, hiệu trưởng ở đây là đối tượng cung cấp giao diện zope.security.interfaces.IPrincipal và chú thích được các đối tượng cung cấp Zope. annotation.interfaces.IAnnotations.
Vấn đề là hiệu trưởng là năng động, các đối tượng không liên tục được tạo ra trên bay cho mỗi sự tham gia an ninh (yêu cầu hoặc một cái gì đó), vì vậy các kỹ thuật ghi chú phổ biến, như AttributeAnnotations không thể được áp dụng cho họ.
Gói này cung cấp một lưu trữ liên tục của các chú thích chính, lưu trữ các chú thích bằng ID chính cũng như một bộ chuyển đổi từ IPrincipal để IAnnotations.
PrincipalAnnotationUtility
Cốt lõi của gói này là lớp PrincipalAnnotationUtility lưu trữ các chú thích cho hiệu trưởng và cho phép để có được chúng một cách dễ dàng.
Nó cung cấp các giao diện IPrincipalAnnotationUtility:
>>> Từ zope.principalannotation.interfaces nhập IPrincipalAnnotationUtility
>>> Từ zope.principalannotation.utility nhập PrincipalAnnotationUtility
>>> Từ zope.interface.verify verifyObject nhập khẩu
>>> Util = PrincipalAnnotationUtility ()
>>> VerifyObject (IPrincipalAnnotationUtility, util)
Thật
Nó cung cấp ba phương pháp: getAnnotations, getAnnotationsById và hasAnnotations. Hãy tạo ra một hiệu trưởng kiểm tra và kiểm tra các phương pháp:
>>> Từ zope.security.testing Hiệu trưởng nhập khẩu
>>> Nadako = Principal ('nadako')
>>> Nadako.id
'Nadako'
Chúng tôi có thể kiểm tra nếu chính của chúng tôi có bất kỳ chú thích. Tất nhiên, hiện tại nó không có bất kỳ:
>>> Util.hasAnnotations (nadako)
Sai
Chúng tôi có thể nhận được IAnnotations đối tượng sử dụng đối tượng chính bản thân:
>>> Util.getAnnotations (nadako)
Hoặc sử dụng id chính:
>>> Util.getAnnotationsById (nadako.id)
Bạn có thể lấy IAnnotations đối tượng cho chính chúng tôi và chơi với nó:
>>> Annots = util.getAnnotations (nadako)
>>> Từ zope.interface.verify verifyObject nhập khẩu
>>> Từ IAnnotations zope.annotation.interfaces nhập khẩu
>>> VerifyObject (IAnnotations, annots)
Thật
Hãy kiểm tra các hợp đồng IAnnotation:
>>> Bool (annots)
Sai
>>> Annots ['not.here']
Traceback (hầu hết cuộc gọi gần đây nhất):
...
KeyError: 'not.here'
>>> Annots.get ('not.here') là None
Thật
>>> Annots.get ('not.here', 42)
42
Lưu ý, các đối tượng IAnnotations được lưu trữ trong các tiện ích chỉ khi chúng ta thiết lập một chìa khóa cho nó. Đây là một tối ưu hóa đơn giản cho phép chúng tôi không lưu trữ bất kỳ dữ liệu khi tất cả chúng tôi chỉ đơn giản là kiểm tra sự hiện diện của các chú thích. Phương pháp hasAnnotations sẽ trở lại sau khi lưu trữ Đúng một khóa trong các chú thích:
>>> Util.hasAnnotations (nadako)
Sai
>>> Annots ['its.here'] = 'một số thông tin'
>>> Util.hasAnnotations (nadako)
Thật
Chúng tôi cũng có thể xóa các khóa hiện tại:
>>> Del annots ['its.here']
Nhưng chúng ta không thể xóa các khóa đó là (không nhiều) còn tồn tại:
>>> Del annots ['its.here']
Traceback (hầu hết cuộc gọi gần đây nhất):
...
KeyError: 'its.here'
Tiện ích Nhiều chú thích
Hãy tưởng tượng rằng ứng dụng của bạn có một trang web đối tượng gốc với registry thành phần của nó (aka quản lý trang web) và đối tượng mà có một đối tượng phụ trang web với registry thành phần riêng của mình, và rằng bạn đăng ký thành phần có thành phần registry của rễ là cơ sở của nó.
Trong trường hợp đó, chúng tôi muốn các IAnnotations phản đối có sẵn để lấy chú thích từ các tiện ích cao cấp hơn.
Hãy đăng ký tiện ích của chúng tôi trong các trang web gốc và tạo ra một sub-site với IPrincipalAnnotationUtility riêng của nó:
>>> Gốc ['util'] = util
>>> Rootsm = root.getSiteManager ()
>>> Rootsm.registerUtility (util, IPrincipalAnnotationUtility)
>>> Từ zope.site.folder thư mục nhập khẩu
>>> Từ zope.site.site LocalSiteManager nhập khẩu
>>> Subsite = Folder ()
>>> Gốc ['subsite'] = subsite
>>> Subsm = LocalSiteManager (subsite)
>>> Subsm .__ bases__ = (rootsm,)
>>> Subsite.setSiteManager (subsm)
>>> Util2 = PrincipalAnnotationUtility ()
>>> Subsite ['util2'] = util2
>>> Subsm.registerUtility (util2, IPrincipalAnnotationUtility)
Bây giờ, chúng ta hãy tạo ra một chìa khóa trong IAnnotations, tiện ích được cung cấp bởi root:
>>> Annots = util.getAnnotations (nadako)
>>> Annots ['root.number'] = 42
Các tiện ích subsite nên chú thành công:
>>> Annots2 = util2.getAnnotations (nadako)
>>> Bool (annots2)
Thật
>>> Annots2 ['root.number']
42
Nếu chúng ta có chìa khóa cả trong các chú thích cấp cao hơn và những người cấp dưới, cấp dưới sẽ được ưu tiên, nhưng cấp cao hơn sẽ không bị xóa hoặc ghi đè:
>>> Annots ['another.number'] = 1
>>> Annots2 ['another.number'] = 42
>>> Annots ['another.number']
1
>>> Annots2 ['another.number']
42
Nếu chúng tôi sẽ xóa các khóa từ cấp thấp hơn, nó sẽ không bị xóa từ một tiện ích cao cấp:
>>> Del annots2 ['another.number']
>>> Annots ['another.number']
1
>>> Annots2 ['another.number']
1
IPrincipal -> IAnnotations bộ chuyển đổi
Tất nhiên, các tính năng đẹp nhất là chúng tôi chỉ đơn giản là có thể thích ứng với đối tượng chủ yếu của chúng tôi để IAnnotations và có được những chú thích bằng cách tiêu chuẩn ghi trong gói zope.annotation.
& Nbsp; >>> annots = IAnnotations (nadako)
& Nbsp; >>> annots
& Nbsp;
& Nbsp; >>> annots ['root.number']
& Nbsp; 42
Theo mặc định, các bộ chuyển đổi sử dụng tiện ích IAnnotation các trang web hiện tại của:
>>> IAnnotations (nadako) là util.getAnnotations (nadako)
Thật
>>> Từ zope.site.hooks setSite nhập khẩu
>>> SetSite (subsite)
>>> IAnnotations (nadako) là util2.getAnnotations (nadako)
Thật
Howerver, chúng ta có thể sử dụng một số nhị phân đa-adapter để IAnnotations để xác định một số đối tượng bối cảnh mà từ đó để có được các tiện ích chú thích:
>>> Từ zope.component getMultiAdapter nhập khẩu
>>> Annots = getMultiAdapter ((nadako, root), IAnnotations)
>>> Annots là util.getAnnotations (nadako)
Thật
>>> Annots = getMultiAdapter ((nadako, subsite), IAnnotations)
>>> Annots là util2.getAnnotations (nadako)
Đúng
là gì mới trong phiên bản này:.
- classifiers Trove Sửa
là gì mới trong phiên bản 3.6.1:
- Cố định một thử nghiệm thất bại trong lồng tại địa phương thiết lập quản lý trang web .
- Loại bỏ sự phụ thuộc vào zope.container.
Yêu cầu :
- Python
Bình luận không