2013-03-09 249 views
0

未登录的用户将由@login_required()修饰符重定向到settings.py中指定的LOGIN_URL。到现在为止还挺好。但我不想那样。而不是重定向他们,我想显示一条错误消息给那些谁没有登录。@login_required()不重定向注销用户

我认为这可能工作,但我得到一个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
@ios_login_required() 
def amiloggedinornot(request): 
    ... 

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

你可以看到ios_login_required调用W/O任何参数田地还需要一个参数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

+0

当我忽略括号中的返回值始终是''“恭喜,您登录!”'' – joschaf 2013-03-09 15:10:42

+0

@Jo。那么'TypeError'是固定的。 'user.is_authenticated'是一个方法,它应该被调用:'如果不是request.user.is_authenticated():'。 – okm 2013-03-09 15:15:07

+0

对,我忘了在''is_authenticated''后添加圆括号。在''@ ios_login_required''之后忽略括号,它应该像它应该那样工作,谢谢!但我很好奇,为什么当我调用这个装饰器时需要省略它们?我所有的其他装饰者都有他们。你知道吗? – joschaf 2013-03-09 15:21:13