【问题标题】:How to add an instance attribute to a subclass of webapp2.RequestHandler?如何将实例属性添加到 webapp2.RequestHandler 的子类?
【发布时间】:2013-06-06 06:41:58
【问题描述】:

我有以下类定义:

class TestHandler(webapp2.RequestHandler):
    def get(self):
        self.msg = "hello world"
        self.render_form()     # modifies self.msg

    def post(self):
        print self.msg
        #...
        #...
        #...
        self.render_form()

运行时出现如下错误:

文件“/Users/mhalsharif/Desktop/wordsnet1/ascii-chan/main.py”,第 129 行,在帖子中 打印 self.msg AttributeError:“AnswersHandler”对象没有属性“msg”

我只是想在“msg”属性中保存一个字符串,并在调用 post() 时打印它。为什么我不能这样做?以及如何解决?

【问题讨论】:

  • post 在没有get 的情况下被调用并且self.msg 尚未定义时,您可能没有处理这种情况。
  • 我在 TestHandler 的构造函数中添加了语句:self.msg="hello first" 但 post 只打印 self.msg 的初始值(即“hello first”)而不是“hello world ”。我检查了日志控制台,get() 总是在 post() 之前调用!

标签: python jinja2 webapp2 requesthandler


【解决方案1】:

webapp2 将在收到的每个请求中实例化一个新的处理程序,因此不能保证如果您在请求中设置self.something,您将能够在另一个请求中检索相同的值,因为self 将是不同的对象。

这就是您的情况:处理您的 get 和 post 请求的处理程序不是同一个实例,因此 post 将无法读取 self.msg,因为它从未被首先设置。

您可以查看docs 以更好地了解处理程序的生命周期。

【讨论】:

  • 我认为类似的事情可能会导致问题。谢谢!
【解决方案2】:

要在请求之间传递 self.msg 等数据,您必须使用数据存储区、cookie 或 webapp2 应用注册表:http://webapp-improved.appspot.com/guide/app.html#registry

【讨论】:

    猜你喜欢
    • 2021-07-26
    • 2015-02-22
    • 2020-03-12
    • 1970-01-01
    • 2015-04-02
    • 2020-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多