Django - 基于非类的视图授权

时间:2015-07-28 21:09:27

标签: python django authentication django-views authorization

我遵循本教程http://www.effectivedjango.com/tutorial/authzn.html。我们创建了类,我们应该使用基于类的视图进行扩展。那么如果我有方法定义的视图呢?我该怎么办?

def some_private_view(request):
    ...

class LoggedInMixin(object):
    @method_decorator(login_required)
    def dispatch(self, *args, **kwargs):
        return super(LoggedInMixin, self).dispatch(*args, **kwargs)

1 个答案:

答案 0 :(得分:1)

您使用login_required装饰器https://docs.djangoproject.com/en/1.8/topics/auth/default/#the-login-required-decorator

你不能装饰一个类,因为装饰器是一个以函数x作为参数的函数,用这个函数x执行某些操作并在之后返回它。这就是为什么你需要相当"无用的"这里的dispatch方法只是在没有做任何事情的情况下调用它的父级,因为类不是函数。

编辑:稍后的注释 - 如果您想跳过"无用的" dispatch方法您可以编写一个Mixin(一个只覆盖特定函数的小小类),只需添加@method_decorator(login_required)to dispatch and use it with all View`s。

你实际上并不需要这样做。那里有django braces为你做这件事。然后你可以这样做:

class AdminView(braces.views.LoginRequiredMixin, View):
    def get(request, *args, **kwargs):
        pass  # Do some logged-in user stuff here