Vì mục đích của cuộc thảo luận này, tôi sẽ giả sử bạn đang sử dụng SQLAlchemy để giao tiếp với DB của bạn.
Nếu bạn có config.add_route('pages', '/pages/{id}')
trong __init__.py
của bạn, bạn có thể thêm một nhà máy tùy chỉnh để thay thế/bổ sung ACL mặc định của bạn. Ví dụ:
ACL hiện tại của bạn có thể trông như thế này:
class RootFactory(object):
__acl__ = [
(Allow, Everyone, 'view'),
(Allow, Authenticated, 'auth'),
]
def __init__(self, request):
self.request = request
Điều này sẽ cho phép người dùng xác thực để truy cập bất kỳ quan điểm với một sự cho phép của 'auth', và bất cứ ai truy cập trang web của bạn để truy cập vào bất kỳ quan điểm với sự cho phép của 'xem'.
Bằng cách sử dụng nhà máy tùy chỉnh, bạn có thể bỏ qua RootFactory hoặc bổ sung nó.
Để bỏ qua, thay đổi config.add_route ban đầu của bạn để ->config.add_route('pages', '/pages/{id}', factory=PageFactory)
và tạo ra một lớp PageFactory như thế này:
class PageFactory(object):
__acl__ = [
(Allow, Everyone, 'view'),
(Allow, Authenticated, 'auth'),
]
def __init__(self, request):
self.request = request
from pyramid.security import authenticated_userid
user_id = authenticated_userid(self.request)
thispage = DBSession.query(Page).filter(Page.id==self.request.matchdict['id']).first()
if thispage.user_id == user_id:
## Pyramid allows Everyone, Authenticated, and authenticated_userid
## (each of these is known as a Principal) to be in the second
## position of the ACL tuple
acl.append((Allow, user_id, 'edit'))
này là giả định xem bạn có permission='edit'
là một trong những thông số của nó.
Bây giờ, nếu bạn muốn sử dụng RootFactory và bổ sung nó với nhà máy tùy chỉnh của bạn, vì vậy bạn không cần phải lặp lại chính mình, chỉ cần để lại cho bạn RootFactory như tôi đã thể hiện ở phần đầu của này môn, kế thừa từ lớp RootFactory, như vậy:
class PageFactory(RootFactory):
@property
def __acl__(self):
acl = super(PageFactory, self).__acl__[:] ##[:] creates a copy
from pyramid.security import authenticated_userid
user_id = authenticated_userid(self.request)
thispage = DBSession.query(Page).filter(Page.id==self.request.matchdict['id']).first()
if thispage.user_id == user_id:
acl.append((Allow, user_id, 'edit'))
return acl
các groupfinder là rất hữu ích, bằng cách này, bởi vì khi đó bạn chỉ có thể đặt người dùng trong nhóm, chẳng hạn như 'admin', và tất cả những người trong nhóm quản trị đều có thể truy cập lượt xem với permission='whatever'
hoặc permission='whateverelse'
mà bạn có thể muốn và không cần Nhà máy, chỉ một kính ngắm nhóm trả về người đánh lừa cho người dùng hiện tại. Than ôi, tôi tiêu hóa, vì đó không phải là những gì bạn đang tìm kiếm. Hy vọng điều này trả lời câu hỏi của bạn.
nitpick nhỏ, nếu nhà máy gốc của bạn trả về 'Không có', thì ngữ cảnh là 'Không có', 404 sẽ không tự động xảy ra trừ khi không thể tìm thấy chế độ xem. Trong ví dụ của bạn 'page_view' sẽ được tìm thấy, nhưng một lệnh cấm sẽ xảy ra do ngữ cảnh' None' không có '__acl__'. –
Nó cuối cùng đã được nhấp. Cho đến ngày hôm nay, tôi đã không thấy mối quan hệ nào giữa lớp Page với lớp bảng ACL và lớp SQLAlchemy Page '. Bây giờ tất cả bắt đầu với nhau. – Kane
Michael: điểm tốt. Một cách để thực hiện hành vi đó là thêm context = Page vào lời gọi view_config. Tôi sẽ cập nhật câu trả lời của tôi để phản ánh điều đó. –