Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python django用户通过测试装饰程序_Python_Django - Fatal编程技术网

Python django用户通过测试装饰程序

Python django用户通过测试装饰程序,python,django,Python,Django,如何为基于类的视图实现@user\u passes\u测试(lambda u:u.is\u superuser)装饰器?我以前在基于函数的视图中使用过这个方法,我有一个变通方法,但感觉不自然 分派方法不应该涵盖这一点吗?您在类的分派方法上使用@method\u decorator: from django.views.generic import View from django.utils.decorators import method_decorator from django.contr

如何为基于类的视图实现
@user\u passes\u测试(lambda u:u.is\u superuser)
装饰器?我以前在基于函数的视图中使用过这个方法,我有一个变通方法,但感觉不自然


分派方法不应该涵盖这一点吗?

您在类的
分派
方法上使用
@method\u decorator

from django.views.generic import View
from django.utils.decorators import method_decorator
from django.contrib.auth.decorators import user_passes_test

class MyView(View):
    @method_decorator(user_passes_test(lambda u: u.is_superuser))
    def dispatch(self, *args, **kwargs):
        return super(MyView, self).dispatch(*args, **kwargs)

我使用了这个片段中的@view\u decorator:来包装我的普通函数decorators。

基于@Chris Pratt的答案,您可能希望在多个视图类中执行此操作,因此将其转换为mixin是有意义的

class SuperuserRequiredMixin(object):
    @method_decorator(user_passes_test(lambda u: u.is_superuser))
    def dispatch(self, *args, **kwargs):
        return super(SuperuserRequiredMixin, self).dispatch(*args, **kwargs)
用法

为了防止意外错误,请确保mixin是第一个继承的类

您可以以相同的方式实现
登录RequiredMixin
,或在应用程序中使用的任何其他常见测试


编辑:添加AccessMixin、LoginRequiredMixin、PermissionRequiredMixin和UserPasseStMixin

您应该查看及其。

请参见下文,但还要注意,u.is\u superuser是用户模型上的布尔字段,而不是方法。所以u.is_superuser()是不正确的-应该只是u.is_superuser。实际上,我只是从上面复制了您的代码,而没有真正查看它
is\u superuser
是一个属性,因此它之后不需要括号。似乎没有使用
TemplateView
-表示
“MyView”对象没有属性“user”
。您不需要在分派方法上使用它,保存覆盖它:
@method\u decorator(user\u通过测试(lambda u:u.is\u superuser),name='dispatch')class MyView(…):
这是最好的答案。这是一个很好的答案!同意。我很惊讶Django没有把这件事说出来。
class MyView(SuperuserRequiredMixin, View):
    def get(self, request):
        ...