如何在权限自定义装饰器中发送HttpResponse?

时间:2018-05-28 14:39:07

标签: django

我正在为我拥有的5个视图创建一个装饰器。该装饰器重定向用户,以防他未经过身份验证或没有权限。但是,如果用户经过身份验证并具有权限,则应该获取该页面。问题是我得到了一个'视图myapp.views.wrapper没有返回一个HttpResponse对象。它返回None而不是'

如何使用返回HttpResponse ...将用户重定向到他试图访问的视图?这是代码:

def ask_permission(func):
    def wrapper(request, *args, **kwargs):
        if not request.user.is_authenticated:
            return redirect('login')
        if not (request.user.groups.filter(name__in=["group_1", "group_2", "group_3"]).exists()):
            return redirect('access_denied')

        # redirect HttpResponse should be here
    return wrapper

我错过了重定向HttpResponse的代码是什么?

由Mehdi Pourfar解答。

此外,如果你想在CBV中使用装饰器,除了在类名之前使用装饰器之外,还必须覆盖这样的调度方法:

@method_decorator(ask_permission)
def dispatch(self, *args, **kwargs):
    return super().dispatch(*args, **kwargs)

甚至更好:

@method_decorator(ask_permission, name='dispatch')
def ModelCreateView(....

这样我们覆盖装饰器中的dispatch方法,我们不需要在类中编写它

1 个答案:

答案 0 :(得分:2)

如果没有满足上述任何条件,你应该返回func(request,* args,** kwargs)。