【发布时间】:2018-05-28 14:39:06
【问题描述】:
我正在为我拥有的 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 中使用装饰器,除了在类名之前使用装饰器之外,你还必须像这样重写 dispatch 方法:
@method_decorator(ask_permission)
def dispatch(self, *args, **kwargs):
return super().dispatch(*args, **kwargs)
甚至更好:
@method_decorator(ask_permission, name='dispatch')
def ModelCreateView(....
这样我们重写了装饰器中的dispatch方法,不需要写在类里面
【问题讨论】:
标签: django