金字塔:多个资源工厂 - 如何

tre*_*der 4 python pyramid

我有一个简单的根资源工厂:

class Root:
    __acl__ = [
        (Allow, Authenticated, 'edit')
    ]
Run Code Online (Sandbox Code Playgroud)

现在对于一些"特殊"路线,我需要创建另一个资源工厂

config.add_route('special', '/special/test', factory=SpecialFactory)

class SpecialFactory:
    __acl__ = [
        (Allow, Authenticated, 'special_edit')
    ]
Run Code Online (Sandbox Code Playgroud)

现在,我想做Root父母SpecialFactory- 我该怎么做?

这是正确的方式......

class SpecialFactory:
    def __init__(self, request):
        self.request = request
        self.__parent__ = Root(request)
        self.__name__ = 'special'

    __acl__ = [
        (Allow, Authenticated, 'special_edit')
    ]
Run Code Online (Sandbox Code Playgroud)

我也完全不了解它的目的__name__和应该设置的目的.

此外,什么时候金字塔会遍历__parent__链条而不是?对于这样的视图配置:

@view_config(route_name='special', permission='special_edit')
def something(req):
    pass
Run Code Online (Sandbox Code Playgroud)

金字塔会'收集'两个权限(special_editedit)还是只有一个(special_edit)?

请详细说明计算权限的"流程".

Mic*_*kel 12

__name__ 只有在通过遍历生成网址时才考虑到这一点,所以不要担心它.

首先,工厂的论点是工厂.意思是,它是接受request对象的"某个对象" ,并期望接收一个实际上是树的根的对象.

class Root:
    def __init__(self, request):
        self.request = request

def resource_factory(request):
    return Root(request)

add_route(..., factory=resource_factory)
Run Code Online (Sandbox Code Playgroud)

请注意,这里的工厂是显而易见的.常用的快捷方式是使用构造对象实例实际返回自身的事实.因此Root(request)从外部看起来完全相同并返回相同的对象resource_factory(request).

好的,所以现在我们有一个"根"对象,我们可以从中开始遍历.当然,这不一定是树的实际根,它只是遍历的起点.

你还没有traverse为你添加一个参数add_route,所以遍历不会去任何地方,它只会将根对象作为上下文返回.查找上下文对象是遍历练习的整个目标.

所以,现在我们有了一个背景.好极了.

金字塔的授权通过将用户的"有效主体"与"上下文"和"许可"相结合来工作.这三件事是您的授权策略将用于确定是允许还是拒绝操作的内容.

"有效主体"来自身份验证策略,代表请求后面的用户.

"上下文"和"许可"是您想要的任何内容.在大多数情况下,它们都是request.context视图的权限,但pyramid.security.has_permission()可以接受任何上下文对象和任何权限,并返回允许或拒绝结果.

所以,我们已经获得了3项授权所需的东西.现在,如何授权?那取决于授权政策.默认情况下ACLAuthorizationPolicy.那么它是怎样工作的?

从那个ACLAuthorizationPolicy开始,context然后向后穿过那个对象的"血统"."沿袭"被定义为通过跟随每个对象__parent__返回到末尾而创建的列表,其中没有更多__parent__要遵循的内容.因此在您的示例中,上下文将是一个实例SpecialFactory,并且上下文的"沿袭"是列表[ SpecialFactory(request), Root(request) ].

ACL匹配的工作方式(在ACLAuthorizationPolicy)中,它遍历从上下文回到根的沿袭中的每个对象__acl__,按顺序搜索每个对象.它找到的第一场比赛是胜利者.在ACL中的条目由定义"(Allow或者Deny,principal,permission)"和匹配是在包含我们正在寻找相同的权限访问控制列表中的条目,作为主要匹配的负责人之一在我们的有效校长的名单当前用户.找到匹配后,搜索停止并返回结果.

如果此算法不适合您,请替换授权策略.它是高度可插拔的,默认实现很容易理解(总共只有几行代码).您甚至可以制定自己的策略,根本不关心上下文,此时您可以忽略所有这些遍历的废话.由你决定.