如何创建应用程序引擎类@login_required装饰

问题描述:

我有这个初始化函数,如果用户已经登录这台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

我发现,以了解装饰器如何工作本页面有用: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): 
     ...