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
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
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
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". –