【问题标题】:Python webapp2: get value of variable of RequestHandler classPython webapp2:获取RequestHandler类的变量值
【发布时间】:2014-10-21 15:38:30
【问题描述】:

我有一个 RequestHandler 的子类:

class GetStats(webapp2.RequestHandler):
    somevar = None
    def post(self):
        ...
        somevar = "somevalue"

并且正在创建此类的实例:

application = webapp2.WSGIApplication([
    ('/stats', GetStats),
], debug=True)

所以我的问题是:如何在 GetStats 类之外获取 somevar 的值?

我没有此类实例的名称。

可以不将此值保存到全局变量吗?

一些更新:

可以创建class Route的特定实例:

mp = webapp2.Route('/', handler=MainPage)
gs = webapp2.Route('/stats', handler=GetStats)

并通过这种方式初始化application

application = webapp2.WSGIApplication([mp,gs], debug=True)

但无论如何都没有 GetStats 类的实例名称。

在这种情况下handler=GetStats是否有任何实例化?

如何直接创建 GetStats 的实例?

【问题讨论】:

标签: python google-app-engine python-2.7 webapp2


【解决方案1】:

您可以将其写入数据存储区:

from google.appengine.ext import db

class someVarClass(db.Model):
  somevarField = db.StringProperty(required=True)

class GetStats(webapp2.RequestHandler):
    somevar = None
    def post(self):
        ...

        somevar = "somevalue"
        u = someVarClass(somevarField= somevar)
        u.put()

【讨论】:

  • 这不是一个错误的答案,但它的性能不是很好。如果要选择数据存储来解决问题,memcache 会是更好的选择。
【解决方案2】:

对于每个请求,都会创建新的处理程序实例。

解决此问题的唯一方法是将处理程序实例保存在请求注册表中。

替代方式:使用 webapp2 注册表

class GetStats(webapp2.RequestHandler):
    def post(self):
        ...
        somevar = "somevalue"
        application.registry['variable'] = somevar
        ...


# outside class
application.registry.get('variable')

这种方式可以避免模块中的全局变量。

【讨论】:

  • 什么是请求注册表?
  • 干杯我还不知道
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-30
  • 2012-01-23
相关资源
最近更新 更多