@login_required(),不重定向已注销的用户

时间:2013-03-09 14:54:02

标签: python django python-decorators

未登录的用户会被@login_required()装饰器重定向到LOGIN_URL中指定的settings.py。到现在为止还挺好。但我不想要那个。我想向没有登录的人显示错误消息,而不是重定向它们。

我认为这可行,但我得到的TypeError: ios_login_required() takes exactly 1 argument (0 given)我不明白。它是一个装饰者,它需要什么样的论据?

def ios_login_required(f):
    def wrapper(request, *args, **kwargs):
        if not request.user.is_authenticated:
            return HttpResponse("You need to be logged in.")
        else:
            return f(request, *args, **kwargs)
    return wrapper

带有装饰器的视图可能如下所示:

@ios_login_required()
def amiloggedinornot(request):
    return HttpResponse("Congrats, you are logged in!")

我出错的任何想法?

1 个答案:

答案 0 :(得分:1)

@ios_login_required()
def amiloggedinornot(request):
    ...

# equals to 
def amiloggedinornot(request):
    ...
amiloggedinornot = ios_login_required()(amiloggedinornot)

您可以看到ios_login_required在没有任何参数的情况下被调用,而需要参数f

因此尝试类似(()之后没有@ios_login_required):

@ios_login_required
def amiloggedinornot(request):
    ...

# which equals to
def amiloggedinornot(request):
    ...
amiloggedinornot = ios_login_required(amiloggedinornot)

您可以阅读有关Python装饰器herehere

的更多信息

此外,user.is_authenticated是一种方法,您需要调用它来获取布尔结果。 not user.is_authenticated始终为False