python继承如何与GAE一起使用?

时间:2014-05-09 22:52:32

标签: python google-app-engine inheritance webapp2

所以,我现在浪费了大约两个小时的bug,我认为它与python和GAE中的继承问题有关。

我有2个班级BlogHandler和孩子LoginHandler

    class BlogHandler(webapp2.RequestHandler):    
        def __init__(self, request=None, response=None):
            super(BlogHandler, self).__init__(request, response)
            self.is_logged_in = False

        def initialize(self, *args, **kwargs):
            webapp2.RequestHandler.initialize(self, *args, **kwargs)
            logging.warning('Checking for cookie')

            if True:
                self.is_logged_in = True
                logging.warning('We are logged in!')
            else:
                logging.warning('We seem to be logged out')

    class LoginHandler(BlogHandler):    
        def get(self):
            logging.warning('Choose wisely!: + %s', self.is_logged_in)
            if self.is_logged_in:
                self.redirect(MAIN_URL)
            else:
                self.render("login.html")

每当我从客户端收到GET请求时,initialize(self, *args, **kwargs)方法将在父进程中运行,然后get(self):方法将在该子进程上运行。

现在我希望父亲与孩子共享变量is_logged_in变量。我必须给varible一个默认值,所以我在父的构造函数中将其初始化为False

然后,当我运行initialize(self, *args, **kwargs)时,我会检查一个始终为True的条件,因此它有100%的机会将is_logged_in变量更改为True

回到孩子,我检查所述变量的值,并且...... 总是为假。我无法理解这个错误,特别是因为我知道我正在改变所述变量的值。这是一个日志:

WARNING  2014-05-09 22:50:52,062 blog.py:47] Checking for cookie
WARNING  2014-05-09 22:50:52,062 blog.py:51] We are logged in!
WARNING  2014-05-09 22:50:52,063 blog.py:116] Choose wisely!: + False
INFO     2014-05-09 22:50:52,071 module.py:639] default: "GET /blog/login HTTP/1.1" 200 795

为什么会这样?我不理解的是什么?

2 个答案:

答案 0 :(得分:3)

提供的另一个答案为您解决了,但没有解释原因。

这与GAE无关,或者python继承失败。

在您的情况下,__init__方法由LoginHandler继承,并且在is_logged_in调用后始终将False设置为super。这是继承的预期行为。

问题是您在设置super之前在__init__中呼叫is_logged_in,这意味着无论您使用自己的initialize方法做什么,都会立即无条件地覆盖它

答案 1 :(得分:2)

尝试更改:

class BlogHandler(webapp2.RequestHandler):
    def __init__(self, request=None, response=None):
        self.is_logged_in = False
        super(BlogHandler, self).__init__(request, response)

在调用super之前设置属性。