我跟随" 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对象中?
答案 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
方法。