Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何为应用程序引擎类创建@login\u必需的装饰器_Python_Google App Engine - Fatal编程技术网

Python 如何为应用程序引擎类创建@login\u必需的装饰器

Python 如何为应用程序引擎类创建@login\u必需的装饰器,python,google-app-engine,Python,Google App Engine,我有这个初始化函数,如果用户已经登录,它会设置self.user 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 Us

我有这个初始化函数,如果用户已经登录,它会设置self.user

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")
当我尝试示例住所时,我得到了
'namererror:name'login\u 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
本例中的装饰器应用于实例方法,而不是类ie:

class Test(MainHandler)
    @login_required
    def get(self):
        ...

您发布的代码有很多错误,但它不会给出您显示的错误(您不会调用任何名为“authenticate”的东西)。对,这是一个错误。先前调用了所需的登录名。我们已经改变了这一点。