非基于类的视图授权



我遵循这个教程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)

您使用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调度and use it with all视图的。

你实际上不需要那样做。django的大括号可以帮你完成这个。然后输入:

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

最新更新