我认为你缺少的部分是遍历部分。是产品
资源?好吧,这取决于你的遍历产生了什么,它
可以生产产品......
也许最好从视图回到
创建应用程序时如何配置......
这是一个典型的视图。
@view_config(context=Product, permission="view")
def view_product(context, request):
pass # would do stuff
因此,当上下文是 Product 的实例时,会调用此视图。和
如果acl该实例的属性具有“视图”
允许。那么 Product 的实例如何成为上下文呢?
这就是遍历的魔力所在。
遍历简单来说就是字典的字典。所以一种方法是,这
如果你有一个像这样的网址,那么对你有用
/product/1
不知何故,某些资源需要通过
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 是一个对象
这就像一本字典。这 ”name" and "parent”
金字塔需要属性才能生成 url
正确工作的方法。
现在我们有了一个可以遍历的资源。我们如何告诉
金字塔遍历产品容器?我们通过
配置器对象。
config = Configurator()
config.add_route(name="product",
path="/product/*traverse",
factory=ProductContainer)
config.scan()
application = config.make_wsgi_app()
工厂参数需要一个可调用的参数,它会将当前的参数传递给它
要求。恰好ProductContainer。init会做
那就好了。
对于这样一个简单的例子来说,这似乎有点太多了,但希望
你可以想象各种可能性。这种模式允许非常
细粒度的权限模型。
如果您不想要/不需要非常精细的权限模型,例如行
level 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()
注意:我从记忆中完成了代码示例,显然您需要所有必要的导入等。换句话说,这不能用作复制/粘贴