2014-10-18 30 views
0

我有這個初始化函數,如果用戶已經登錄這臺self.user如何創建應用程序引擎類@login_required裝飾

class MainHandler(webapp2.RequestHandler): 

    def initialize(self, *a, **kw): 
     webapp2.RequestHandler.initialize(self, *a, **kw) 
     uid = self.read_secure_cookie('user_id') 
     self.user = uid and User.by_id(int(uid)) 

我想創建一個將用戶重定向到登錄頁面,如果一個裝飾她沒有登錄:

def login_required(cls): 
    if not self.user: 
     self.redirect("/login") 

@login_required 
class Test(MainHandler) 
    def get(self): 
     self.write("this will only display if I am logged in") 

當我試圖例子住所,我得到'NameError: name 'login_required' is not defined'

我缺少什麼?

+1

有很多毛病,您對代碼張貼,但它不會給你顯示的錯誤(你不稱爲任何名爲「認證」)。 – 2014-10-18 20:03:00

+0

沒錯,那是一個錯誤。 login_required之前稱爲authenticate。已經改變了。 – 2014-10-18 20:09:33

回答

2

我發現,以瞭解裝飾器如何工作本頁面有用:http://simeonfranklin.com/blog/2012/jul/1/python-decorators-in-12-steps/

你的裝飾需要執行它需要的任何任務後調用處理程序。這是我目前的login_required裝飾定義的變化:

def login_required(handler): 
    def check_login(self, *args, **kwargs): 
     userToken = auth.get_auth().get_user_by_session() 
     if not userToken:    
      logging.info('No user found for session: login required') 
      return self.redirect(LOGIN_URL, abort=False)      
     return handler(self, *args, **kwargs) # Call the handler method 
    return check_login 

在這種情況下,裝飾應用到實例方法,而不是類,即:

class Test(MainHandler) 
    @login_required 
    def get(self): 
     ... 
相關問題