2012-03-02 4 views
9

필자는 새로 만든 피라미드 응용 프로그램에 대한 인증 (및 인증)을 구현하는 방법을 읽었습니다. 나는 "자원"이라는 개념에 부딪 치고있다. 나는 내 응용 프로그램에서 python-couchdb를 사용하고 있으며 RDBMS를 전혀 사용하지 않으므로 SQLAlchemy가 없다. 다음과 같이 Product 객체를 만들면 :피라미드 자료 : 일반 영어

class Product(mapping.Document): 
    item = mapping.TextField() 
    name = mapping.TextField() 
    sizes = mapping.ListField() 

누군가이 정보를 리소스라고도 부를 수 있습니까? 나는 피라미드의 전체 문서를 읽고 있었지만, 어디에서 그것이 단순한 영어로 자원을 설명하는지 (어쩌면 나는 단지 어리 석다). 내가 있다면

class Product(mapping.Document): 
    __acl__ = [(Allow, AUTHENTICATED, 'view')] 
    item = mapping.TextField() 
    name = mapping.TextField() 
    sizes = mapping.ListField() 

    def __getitem__(self, key): 
     return <something> 

또한 순회를 사용하여 내 파이썬 CouchDB를에 의 getItem 기능이 평균 추가 않습니다하기 :이 자원의 경우,이 평균 그냥과 같이 여기에 내 ACL 물건 스틱 않습니다 제품 클래스/리소스?

죄송합니다. 새로운 용어 (Pylons 0.9.7에서 온 것)와 정말 혼란 스럽습니다.

미리 감사드립니다.

답변

6

누락 된 부분은 통과 부분이라고 생각합니다. 제품 은 자원입니까? 글쎄 그것은 당신의 순회가 무엇을 만들어 내느냐에 달려 있습니다. 은 제품을 생산할 수 있습니다 .....

아마 이걸보기에서 끝까지 걸어서 어플을 만들 때 어떻게 구성할까요?

다음은 일반적인보기입니다.

@view_config(context=Product, permission="view") 
    def view_product(context, request): 
     pass # would do stuff 

컨텍스트가 Product의 인스턴스 일 때이 뷰가 호출됩니다. 해당 인스턴스의 acl 속성에 "보기" 권한이있는 경우 입니다. 그렇다면 Product의 인스턴스가 컨텍스트가되는 방법은 무엇입니까?

이것은 순회 마법이 들어오는 곳입니다. 순회의 논리는 단순한 사전 사전입니다. 당신은 어떻게 든

/product/1 

같은 URL이 있다면 그래서이 당신을 위해 일할 수있는 한 가지 방법입니다, 일부 자원은보기가 결정될 수 있도록 컨텍스트를 결정하기 위해 URL의 세그먼트로 이송 될 필요가있다 . 경우 우리는 이제이 문서에 포함되며, 난 당신이 알아야 할 기본 사항까지 그것을 을 끓여을 시도하고있어 뭔가 같은 ...

class ProductContainer(object): 
     """ 
     container = ProductContainer() 
     container[1] 
     >>> <Product(1)> 
     """ 
     def __init__(self, request, name="product", parent=None): 
      self.__name__ = name 
      self.__parent__ = parent 
      self._request = request 

     def __getitem__(self, key): 
      p = db.get_product(id=key) 

      if not p: 
       raise KeyError(key) 
      else: 
       p.__acl__ = [(Allow, Everyone,"view")] 
       p.__name__ = key 
       p.__parent__ = self 
       return p 

있었다 무엇. ProductContainer는 사전처럼 작동하는 개체입니다. "이름"및 "부모" URL 생성 메서드가 제대로 작동하려면 피라미드에서 특성이 필요합니다.

이제 우리는 트래버스 할 수있는 리소스를 갖게되었습니다. ProductContainer를 통과하기 위해 피라미드에 을 어떻게 말합니까? 구성자 객체를 통해이를 수행합니다.

config = Configurator() 
    config.add_route(name="product", 
        path="/product/*traverse", 
        factory=ProductContainer) 
    config.scan() 
    application = config.make_wsgi_app() 

공장 매개 변수는 호출을 기대하고 그것에게 현재 요청을 손. ProductContainer가 그렇게됩니다. 은 으로 처리됩니다.

이 간단한 예제에서는 조금 더 보일 수도 있지만, 가능하면 가능성을 상상해보십시오. 이 패턴을 사용하면 아주 세밀한 사용 권한 모델 인 을 사용할 수 있습니다.

로우 레벨 acl과 같이 매우 세분화 된 권한 모델을 원하지 않거나 필요로하지 않으려면 아마도 루트가 아닌 경로를 단일 루트 팩터 리로 사용할 수 있습니다.

class RootFactory(object): 
     def __init__(self, request): 
      self._request = request 
      self.__acl__ = [(Allow, Everyone, "view")] # todo: add more acls 


    @view_config(permission="view", route_name="orders") 
    def view_product(context, request): 
     order_id, product_id = request.matchdict["order_id"], request.matchdict["product_id"] 
     pass # do what you need to with the input, the security check already happened 

    config = Configurator(root_factory=RootFactory) 

    config.add_route(name="orders", 
        path="/order/{order_id}/products/{product_id}") 

    config.scan() 
    application = config.make_wsgi_app() 

참고 : 나는 분명히 당신이

+0

젠장 ... 나는 아직도이 추상 개념을 이해할 수 없다. __name__ 값은 config.add_route (name = "")의 것과 동일해야합니까? 그것은 Traversal이/photo/1과 같이 들어오는 URL을 매칭 할 때 사용할 Resource를 결정하는 방법입니까? 내 앱의 예를 설명하려고 할 수 있습니까? 내 응용 프로그램은 제품 주문을 처리합니다. 각 주문에는 1 개 또는 여러 개의 제품이있을 수 있습니다. 즉, __parent__ 특성을 Order 자원으로 설정하고 __name__ 특성을 Product 자원의 이름으로 지정해야합니까? – Mark

+0

죄송합니다. 위 내용이 충분하지 않았습니다. ProductConatiner를 보면, 문서에서 언급 한 것과 같은 "Factory"입니까? 이것은 내 리소스가 Product라는 python-couchdb 객체가 될 수 있다는 점을 감안할 때 각 리소스에 대한 팩토리를 만들어야한다는 것을 의미합니까? – Mark

+0

add_route의 이름은 시스템의 모든 경로에 대해 고유해야합니다. 경로의 세그먼트와 일치 할 필요는 없습니다. 나는 단지 그것을 "제품"으로 명명 할 수있다. –

0

당신이 http://michael.merickel.org/projects/pyramid_auth_demo/를 통해 일한 복사/붙여 넣기로 작동하지 않을 즉 등 필요한 모든 수입을 필요로 메모리에서 코드 예제를했다 ? 그렇지 않다면 도움이 될 것으로 생각됩니다. 마지막 섹션 http://michael.merickel.org/projects/pyramid_auth_demo/object_security.html은 패턴을 구현합니다 (예제 "모델"클래스는 object보다 복잡한 것으로부터 상속받습니다).