2012-03-02 37 views
9

Tôi đã đọc về các cách để triển khai ủy quyền (và xác thực) cho ứng dụng Pyramid mới được tạo của tôi. Tôi tiếp tục chạm vào khái niệm gọi là "Tài nguyên". Tôi đang sử dụng python-couchdb trong ứng dụng của tôi và không sử dụng RDBMS ở tất cả, do đó không có SQLAlchemy. Nếu tôi tạo đối tượng Sản phẩm như vậy:Tài nguyên kim tự tháp: Bằng tiếng Anh đơn giản

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

Ai đó có thể vui lòng cho tôi biết điều này còn được gọi là tài nguyên không? Tôi đã đọc toàn bộ tài liệu của Kim tự tháp, nhưng không có nơi nào nó giải thích các nguồn lực hạn bằng tiếng Anh đơn giản đơn giản (có lẽ tôi chỉ là ngu ngốc). Nếu đây là tài nguyên, không có nghĩa là tôi chỉ dính vào những thứ ACL của tôi ở đây như sau:

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

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

Nếu tôi được cũng sử dụng Traversal, không có nghĩa là tôi thêm GetItem chức năng trong tôi python-couchdb Lớp sản phẩm/tài nguyên?

Rất tiếc, điều này thực sự gây nhầm lẫn với tất cả các cụm từ mới (tôi đến từ giá treo Pylons 0.9.7).

Xin cảm ơn trước.

Trả lời

6

Tôi nghĩ rằng phần bạn đang bỏ lỡ là phần truyền tải. Sản phẩm có phải là tài nguyên không? Vâng nó phụ thuộc vào những gì traversal của bạn sản xuất, nó có thể sản xuất các sản phẩm .....

Có lẽ tốt nhất là nên đi bộ này qua xem lại cách thức cấu hình khi ứng dụng được tạo ...

Đây là chế độ xem điển hình.

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

Vì vậy, chế độ xem này được gọi khi ngữ cảnh là một phiên bản của Sản phẩm. VÀ nếu thuộc tính acl của cá thể đó có quyền "xem" . Vậy làm thế nào một thể hiện của sản phẩm trở thành bối cảnh?

Đây là nơi phép thuật truyền tải đi vào. Logic rất đơn giản của truyền tải đơn giản chỉ là từ điển từ điển. Vì vậy, một trong những cách mà điều này có thể làm việc cho bạn là nếu bạn đã có một url như

/product/1 

Bằng cách nào đó, một số tài nguyên cần phải được đi qua bởi các phân đoạn của các url để xác định một bối cảnh như vậy mà một cái nhìn có thể được xác định . Điều gì nếu chúng tôi đã có một cái gì đó giống như ...

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 

Bây giờ điều này được nêu trong tài liệu và tôi đang cố gắng để đun sôi nó xuống những điều cơ bản bạn cần biết. ProductContainer là một đối tượng hoạt động như một từ điển. Các thuộc tính "tên" và "cha mẹ" được yêu cầu bởi kim tự tháp để tạo thế hệ URL phương pháp hoạt động đúng.

Vì vậy, bây giờ chúng tôi có một tài nguyên có thể được duyệt qua. Làm cách nào để chúng tôi yêu cầu kim tự tháp di chuyển qua ProductContainer? Chúng tôi làm điều đó thông qua đối tượng Cấu hình .

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

Tham số nhà máy mong muốn có thể gọi và nó đưa yêu cầu hiện tại. Nó chỉ xảy ra như vậy mà ProductContainer. init sẽ làm điều đó tốt.

Điều này có vẻ hơi nhiều cho một ví dụ đơn giản như vậy, nhưng hy vọng bạn có thể tưởng tượng ra các khả năng. Mẫu này cho phép rất mô hình quyền chi tiết.

Nếu bạn không muốn/cần một mô hình quyền chi tiết như hàng cấp ACL bạn có thể không cần truyền tải, thay vào đó bạn có thể sử dụng các tuyến đường với một nhà máy gốc duy nhất.

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() 

lưu ý: tôi đã làm ví dụ mã từ bộ nhớ, rõ ràng bạn cần tất cả các hàng nhập khẩu, vv cần thiết hay nói cách khác đây không phải là đi làm việc như một copy/paste

+0

Chết tiệt ... Tôi vẫn không thể hiểu khái niệm trừu tượng này. Giá trị __name__ có phải giống với giá trị trong config.add_route (name = "") không? Đó có phải là cách Traversal tìm ra nguồn nào để sử dụng khi kết hợp URL đến như/ảnh/1? Tôi có thể thử minh họa ví dụ về ứng dụng của mình không? Ứng dụng của tôi xử lý đơn đặt hàng của sản phẩm. Mỗi đơn đặt hàng có thể có 1 hoặc nhiều sản phẩm trong đó. Điều này có nghĩa là thuộc tính __parent__ phải được đặt thành tài nguyên Đơn hàng và thuộc tính __name__ phải là tên của tài nguyên Sản phẩm không? – Mark

+0

Xin lỗi, thông tin trên không đủ dài. Nhìn vào ProductConatiner, đó là một "Nhà máy" giống như những gì được đề cập trong tài liệu? Điều này có nghĩa là tôi phải tạo một nhà máy cho từng tài nguyên, vì tài nguyên của tôi có thể là đối tượng python-couchdb được gọi là Sản phẩm? – Mark

+0

tên trong add_route phải là duy nhất cho tất cả các tuyến trong hệ thống. nhưng nó không phải khớp với một đoạn trong đường dẫn. Tôi cũng có thể đặt tên nó là "sản phẩm". –

Các vấn đề liên quan