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