2008-12-02 52 views
1

我做了這個裝飾器,導致無限的重定向循環。獲取重定向循環admin_only裝飾器

問題是這樣的:

args[0].redirect(users.create_login_url(args[0].request.path)) 

這似乎是一個完全有效的URL。那麼爲什麼它不能正確重定向呢?

def admin_only(handler, *args): 

    def redirect_to_login(*args, **kwargs): 
     return args[0].redirect(users.create_login_url(args[0].request.path)) 

    user = users.get_current_user() 
    if user: 
     if authorized(user): 
      return handler(args[0]) 
     else: 
      logging.warning('An unauthorized user has attempted to enter an authorized page') 
      return redirect_to_login 
    else: 
     return redirect_to_login 

回答

2

看來你並沒有正確定義你的裝飾器。

每次你用一個函數包裝一個裝飾器時,只會調用一個裝飾器一次;從那時起裝飾器返回將被調用的函數。看來你(錯誤地)認爲每次都會調用裝飾器功能本身

嘗試這樣代替:

def redirect_to_login(*args, **kwargs): 
    return args[0].redirect(users.create_login_url(args[0].request.path)) 

def admin_only(handler): 
    def wrapped_handler(*args, **kwargs):  
     user = users.get_current_user() 
     if user: 
      if authorized(user): 
       return handler(args[0]) 
      else: 
       logging.warning('An unauthorized user has attempted ' 
           'to enter an authorized page') 
       return redirect_to_login(*args, **kwargs) 
     else: 
      return redirect_to_login(*args, **kwargs) 

    return wrapped_handler 

注意,在上面的代碼中,裝飾只是定義了一個新的功能,並返回它,而這個新的函數本身做相關檢查。

0

您確定正在發送正確的狀態碼嗎?您可以使用Firefox的live http頭文件來檢查是否正在發送301或303。

0

你應該使用螢火蟲或活的http頭或其他東西,看看究竟發生了什麼。我的猜測:您的授權()函數始終返回false(即使用戶已登錄),因此它會重定向到登錄頁面(如果用戶已經登錄),會立即將用戶重定向回您的頁面,重定向...你明白了。

0

這個問題實際上就是當我使用

return args[0].redirect(users.create_logout_url(args[0].request.uri)) 

這正好登出頁面,然後重定向到當前頁面。但是,我的日誌顯示當前頁面認爲我仍然登錄,即使註銷完成後也是如此。

這很奇怪,因爲我沒有修改應用引擎用戶API中的任何內容。