__name__
仅在通过遍历生成 url 时才会考虑,因此不必担心。
首先,工厂参数是工厂。意思是,它是接受一个的“某个对象”request
对象,并期望收到一个实际上是树的根的对象。
class Root:
def __init__(self, request):
self.request = request
def resource_factory(request):
return Root(request)
add_route(..., factory=resource_factory)
请注意,这里的工厂是多么明显。常用的快捷方式是利用构造对象实例实际上返回自身的事实。所以Root(request)
从外面看起来完全一样,并返回相同的对象resource_factory(request)
.
太好了,现在我们有了一个“根”对象,可以从它开始遍历。当然,这不一定是树的实际根,它只是遍历应该开始的地方。
您还没有添加traverse
论证你的add_route
,所以遍历不会去任何地方,它只会返回根对象作为上下文。查找上下文对象是遍历练习的全部目标。
所以,现在我们有了一个背景。耶。
金字塔的授权通过将用户的“有效主体”与“上下文”和“权限”相结合来发挥作用。您的授权策略将使用这三件事来确定是否允许或拒绝操作。
“有效主体”来自身份验证策略,代表请求背后的用户。
“上下文”和“权限”是你想要的任何内容。大多数情况下它们是request.context
和视图的许可,但是pyramid.security.has_permission()
可以接受任何上下文对象和任何权限,并向您返回允许或拒绝结果。
因此,我们已经获得了授权所需的 3 项内容。那么,如何授权呢?这取决于授权政策。默认情况下,ACLAuthorizationPolicy
。那么它是怎样工作的?
The ACLAuthorizationPolicy
开始于context
并通过该对象的“血统”向后追溯。 “谱系”被定义为通过遵循每个对象的__parent__
回到终点,再也没有了__parent__
跟随。所以在你的例子中,上下文将是一个实例SpecialFactory
,上下文的“血统”是列表[ SpecialFactory(request), Root(request) ]
.
ACL 匹配的工作方式(在ACLAuthorizationPolicy
)是它从上下文到根遍历谱系中的每个对象,搜索每个对象的__acl__
为了。它找到的第一场比赛就是胜利者。 ACL 中的条目由“(Allow
or Deny
, principal
, permission
)”并且匹配是 ACL 中的一个条目,它包含我们正在查找的相同权限,因为主体与当前用户的有效主体列表中的主体之一相匹配。一旦找到匹配项,搜索就会停止,并且返回结果。
如果此算法不适合您,请更换授权策略。它具有高度可插拔性,并且默认实现很容易理解(总共只有几行代码)。您甚至可以制定自己的策略,根本不关心上下文,此时您可以忽略所有这些遍历废话。由你决定。