2016-03-25 52 views
0

我有Python腳本在谷歌應用程序引擎我webapp2的應用:只持續了請求的生命週期全局變量 - Python中,webapp2的

x = 0 

class MyHandler(webapp2.RequestHandler): 

     def get(self): 

      global x 
      x = x + 1 
      print x 

隨着頁面的每次刷新(或連接新用戶) ,計數遞增。 Python並沒有在每個請求中啓動一個新的進程(但我期望它)。我該如何處理那些我只想要一個只在請求的生命週期內持續存在的全局變量的場景?我可以使用一個實例變量,具體如何?

回答

1

您的預期行爲。每個請求都不會啓動新實例。

使用請求對象,env對象或線程局部變量來存儲您希望在請求的整個生命週期內訪問代碼中任何位置的信息。 (Environ是在每個請求中重新創建的,因此它是安全的)。關於使用線程本地存儲的討論,請參閱Is threading.local() a safe way to store variables for a single request in Google AppEngine?

下面是存儲本地請求對象以存儲請求生命期的特定信息的示例。所有這些代碼必須在你的處理程序中。所有的部分都記錄在webapp2文檔中。順便說一下,我不使用webapp2,所以這沒有測試。 (我使用pyramid/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 [ '鍵']的值必須是字符串。

閱讀Webob文檔如何在請求對象中存儲任意值。 http://docs.webob.org/en/stable/reference.html#ad-hoc-attributes -

req.environ['webob.adhoc_attrs'] 
{'some_attr': 'blah blah blah'} 

此外,如果你有webapp2的Request對象的文檔的讀取,有一個註冊表,你可以用它來存儲信息 - http://webapp-improved.appspot.com/api/webapp2.html#webapp2.Request

注意,你定義外部的請求處理程序是任何變量基本上是緩存的,可用於實例的生命週期。這是你出錯的地方。

要了解如何/爲什麼應用程序級別的緩存工作 - 爲什麼你想看看https://cloud.google.com/appengine/docs/python/requests#Python_App_caching

+0

對不起你的第一次嘗試沒有做,你能幫助我的代碼?我與Python新... – Dennix