【问题标题】:How to send a HttpResponse in a permission custom decorator?如何在权限自定义装饰器中发送 HttpResponse?
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

    • 现在我得到 '__init__() 接受 1 个位置参数,但给出了 2 个'错误消息,即使我只使用 'return func(request)'
    • init属于哪个类?
    • 多试几次后,我发现我在使用 CBV 时收到了该消息。如果我使用非 CBV 效果很好。
    • 我的错。我检查了文档,似乎你只能装饰非 CBV 类。为此,您应该改为装饰调度方法:docs.djangoproject.com/en/2.0/topics/class-based-views/intro/…
    猜你喜欢
    • 1970-01-01
    • 2018-01-27
    • 2013-02-06
    • 1970-01-01
    • 2011-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-25
    相关资源
    最近更新 更多