我在Google App Engine的WebApp2应用程序中有Python脚本:
x = 0
class MyHandler(webapp2.RequestHandler):
def get(self):
global x
x = x + 1
print x每次刷新页面(或连接新用户)时,计数都会递增。Python不会针对每个请求启动一个新进程(但我预料到了)。当我想要一个全局变量只在请求的生命周期内存在时,我该如何处理呢?我可以使用实例变量吗?具体如何使用?
发布于 2016-03-25 09:28:26
你所看到的行为是意料之中的。并不是每个请求都会启动新实例。
使用request对象、env对象或线程局部变量来存储您希望在请求的生命周期内在代码中的任何位置都可以访问的信息。(在每个请求中都会重新创建环境,因此它是安全的)。
有关使用线程本地存储的讨论,请参阅Is threading.local() a safe way to store variables for a single request in Google AppEngine?。
下面是一个存储本地请求对象的示例,用于存储请求生命周期的特定信息。所有这些代码必须在您的处理程序中。所有部件都记录在webapp2文档中。顺便说一句,我没有使用webapp2,所以这没有经过测试。(我使用金字塔/bobo和这个模型来执行请求级缓存)。
类MyHandler(webapp2.RequestHandler):
def get(self):
req = webapp2.get_request()
# you have request in self, however this is to show how you get a
# request object anywhere in your code.
key = "Some Key"
if req:
# getting some store value from the environ of request (See WebOb docs)
someval = req.environ.get(key,None)
if someval :
# do something
# and setting
if req:
req.environ[key] = 'some value'这样做有一个限制,即environ‘’key‘值必须是一个字符串。
阅读Webob文档,了解如何在request对象中存储任意值。http://docs.webob.org/en/stable/reference.html#ad-hoc-attributes -
req.environ['webob.adhoc_attrs']
{'some_attr': 'blah blah blah'}此外,如果您读取了webapp2请求对象文档,则可以使用一个注册表http://webapp-improved.appspot.com/api/webapp2.html#webapp2.Request来存储信息
请注意,您在请求处理程序外部定义的任何变量本质上都是缓存的,在实例生命周期内可用。这就是你错的地方。
要了解应用程序级缓存的工作原理和原因,以及第一次尝试没有达到预期效果的原因,可以查看https://cloud.google.com/appengine/docs/python/requests#Python_App_caching
https://stackoverflow.com/questions/36212614
复制相似问题