我遵循本教程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)
答案 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