嵌套装饰者,筹集404

时间:2014-02-12 12:40:08

标签: python django

假设我有视图

def foo(request)

我也使用自定义用户模型如下:

class MyUser(AbstractUser):
    field = models.BooleanField()

我想组合2个django装饰器:login_required和user_passed_test,以便匿名用户应该重定向到登录页面,不允许看到视图的用户(user.field == False)应该看到一个正确的消息(比如说'你不允许看到这个')。

所以我试过了:

my_decor = user_passes_test(lambda user: user.field == True,
                        login_url='/bar')  


def custom_decor(view_func):
    decorated_view_func = login_required(my_decor(view_func), login_url='/login')
    return decorated_view_func

我还必须定义视图:

def bar(request):
    return HttpResponse('you are not allowed to see this context.')

并在我的网址中对其进行硬编码。

问题是:我可以在不创建其他视图并将其添加到网址的情况下执行此操作吗?有没有办法让'user_passed_test'装饰器引发404错误而不是重定向到登录视图?

可能有一个非常简单的解决方案,当然我只是错过了它。

1 个答案:

答案 0 :(得分:0)

我不太清楚装饰器语法,但你可以这样做:

def custom_decor(view_func):
    def decorator(request, *args, **kwargs)
        if request.user.field is True:
            return view_func(request, *arg, **kwargs)
        raise Http404

    return decorator

所以...

@login_required(login_url='/login')
@custom_decor
def foo(request)
    # ...