自定义装饰器需要权限和登录

时间:2017-08-18 20:34:42

标签: python django decorator python-decorators

我跟随" Django Unleashed Book"我已经创建了一个自定义装饰器。我很难理解代码的某些部分。缺乏理解可能是因为缺乏蟒蛇知识。这是代码:

def require_authenticated_permission(permission):

def decorator(cls):
    if (not isinstance(cls, type)
            or not issubclass(cls, View)):
        raise ImproperlyConfigured(
            "require_authenticated_permission"
            " must be applied to subclasses "
            "of View class.")
    check_auth = method_decorator(login_required)
    check_perm = method_decorator(
            permission_required(
                permission,
                raise_exception=True))

    cls.dispatch = check_auth(check_perm(cls.dispatch))
    return cls

return decorator

我对理解代码有一个问题。 装饰器采用GCBV,使用调度功能并将GCBV存储在"权限" object作为" require_authenticated_permission"的参数。然后它从GCBV(例如DetailView)获取参数并将其存储在" cls"宾语。由于只有一个cls对象而不是* args之类的东西,我希望装饰器只使用一个参数,例如" class ThisIsAView(Detailview)"但它也适用于像这样的视图"类ThisIsAView(GetObjectMixin,Detailview)" ...这意味着它将两个参数存储在cls对象中?

1 个答案:

答案 0 :(得分:0)

在装饰器内部,cls是类ThisIsAView,而不是父类DetailView。因此,将类定义为:

并不重要
class ThisIsAView(DetailView):
    ...

class ThisIsAView(MyMixin, DetailView):
    ...

你也说"装饰者将GCBV存储在"权限" object作为" require_authenticated_permission"的参数。这听起来不太对劲。装饰者正在使用GCBV的dispatch方法,并使用permission_required装饰器和login_required装饰器包装它。然后用这个新包装的方法替换CBV的dispatch方法。

相关问题