이 토론의 목적을 위해 SQLAlchemy를 사용하여 DB와 인터페이스한다고 가정합니다. 당신이 당신의 __init__.py
에 config.add_route('pages', '/pages/{id}')
이있는 경우
, 당신은/대체 기본 ACL을 보완하기 위해 사용자 정의 공장를 추가 할 수 있습니다. 예를 들면 :
현재 ACL은 다음과 같이 보일 수 있습니다 :이 인증 된 사용자가 어떤 뷰를 액세스하기 위해 사이트를 방문하는 '인증'의 허가를, 그리고 누구와 어떤보기에 액세스 할 수 있도록 할
class RootFactory(object):
__acl__ = [
(Allow, Everyone, 'view'),
(Allow, Authenticated, 'auth'),
]
def __init__(self, request):
self.request = request
'보기'의 허가.
사용자 지정 공장을 사용하면 RootFactory를 우회하거나 보완 할 수 있습니다.
에 원래 config.add_route을 변경,를 우회하기 ->config.add_route('pages', '/pages/{id}', factory=PageFactory)
이 같은 PageFactory 클래스를 만들 :이보기를 가정 한 것입니다
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'))
매개 변수의 하나로서 permission='edit'
있습니다.당신은 당신이 자신을 반복 할 필요가 없습니다, 당신의 사용자 정의 공장으로 RootFactory 및 보충을 사용하고자하는 경우, 나는이의 시작 부분에 표시 한 바와 같이
이제, 단순히 당신에게 RootFactory를 남겨 당신은 단순히 '관리'와 같은 그룹에 사용자를 배치 할 수 있기 때문에, groupfinder이 방법에 의해, 매우 유용
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
이다
, 그리고 : 포스트, 그리고 그와 같이, RootFactory 클래스에서 상속 admin 그룹의 모든 사용자는으로보기에 액세스 할 수 있습니다.또는
permission='whateverelse'
을 사용하면 현재 사용자에 대한 그룹화자가 반환되는 그룹 파인더 만 사용할 수 있습니다. 아아아, 내가 빗 나간다. 네가보기를 원하는 것이 아니기 때문이다. 희망이 귀하의 질문에 대한 답변.
작은 nitpick, 루트 팩토리가'None'을 반환하면 컨텍스트는'None'입니다. 뷰가 발견되지 않으면 자동으로 404가 발생하지 않습니다. 귀하의 예제에서'page_view'가 발견 될 것이지만'None' 문맥이'__acl__'을 갖지 않기 때문에 금지되어 있습니다. –
마지막으로 클릭했습니다. 오늘까지, 나는 ACL과 페이지 클래스와 SQLAlchemy 페이지 '테이블 클래스'사이의 관계를 볼 수 없었다. 지금 모두 함께 조각하기 시작했습니다. – Kane
Michael : 좋은 지적입니다. 이 동작을 얻는 한 가지 방법은 view_config 호출에 context = Page를 추가하는 것입니다. 나는 그것을 반영하기 위해 나의 대답을 업데이트 할 것이다. –