2013-03-09 63 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