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



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

如何使用返回的 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(....

这样我们就覆盖了装饰器中的调度方法,我们不需要把它写在类中

如果上述条件都不满足,则应返回 func(request, *args, **kwargs(。

最新更新