我正在为我拥有的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方法,我们不需要在类中编写它
答案 0 :(得分:2)
如果没有满足上述任何条件,你应该返回func(request,* args,** kwargs)。