0

未登录的用户被@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!")

有什么想法我哪里出错了吗?

4

1 回答 1

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

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

您可以看到ios_login_required它在需要参数时被调用而没有任何参数f

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

@ios_login_required
def amiloggedinornot(request):
    ...

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

您可以在此处此处阅读有关 Python 装饰器的更多信息

此外,user.is_authenticated是一个方法,您需要调用它才能获得布尔结果。not user.is_authenticated永远都是False

于 2013-03-09T15:02:28.810 回答