2015-10-15 52 views
0

我在Tornado中有一個處理程序,它有一個get()和post()方法。 get方法獲取一些數據庫信息並使用html進行呈現。 post方法用於加載頁面後的ajax調用,並且需要使用get()方法收集的DB數據。在Python的Tornado框架中,實例變量和類變量混淆

我的問題是,如果我將get()和post()之間需要共享的變量設置爲實例變量(即在get()方法中設置self.variable =「foobar」),那麼post )方法不能識別那些實例變量存在。我發現的唯一解決方法是,如果我將這些變量設置爲全局類變量,並在get()中使用MyHandler.variable =「foobar」重置它們。但這似乎是一個駭人聽聞的解決方案。

作品:

class AdminHandler(BaseHandler): 

file_count = 0 
mw_count = 0 
bw_count = 0 
unknown_count = 0 
files = [] 
origins = {} 
file_dicts = [] 

def get(self): 
    AdminHandler.file_count = 0 
    AdminHandler.mw_count = 0 
    AdminHandler.bw_count = 0 
    AdminHandler.unknown_count = 0 
    AdminHandler.files = [] 
    AdminHandler.origins = {} 
    AdminHandler.file_dicts = [] 

    .... 

def post(self): 
    (access class variables) 
    .... 

不起作用:

class AdminHandler(BaseHandler): 

def get(self): 
    self.file_count = 0 
    self.mw_count = 0 
    self.bw_count = 0 
    self.unknown_count = 0 
    self.files = [] 
    self.origins = {} 
    self.file_dicts = [] 

    .... 

def post(self): 
    (access instance variables) 
    .... 
+0

對於每個請求,您都會得到一個新的AdminHandler實例 - 因此,在調用get和post函數之間不會共享任何狀態,就像兩次連續調用get之間不會共享狀態一樣。 。 – dano

+0

HTTP應該是無狀態的。不要在該類上存儲GET數據; POST請求完全獨立且獨立,您收到的GET和POST請求的順序不一定與一個客戶端相關。 –

+0

在POST中進行*相同的數據庫查詢*。 –

回答

0

如果要存儲的信息必須是可用於所有的請求(不是每個用戶..)然後就可以實現類那會爲你保存這些信息。例如:

from threading import Lock 
class MyDataStore: 

    _instance = None 
    _lock = Lock() 

    @classmethod 
    def instance(cls): 
     with cls._lock: 
      if cls._instance is None: 
       cls._instance = MyDataStore() 
      return cls._instance 

    def store_data(self, file_count, mw_count, ...): 
     self.file_count = file_count 
     self.mw_count = mw_count 

     ....... 
MyDataStore.instance().store_data(file_count, mw_count) 

以這種方式,您將只有一個商店類的實例將爲您保存信息。

取代store_data方法,您可以實現自己的方法來處理您所需的信息(可以使用init方法)。你也可以添加一個方法,告訴你數據是否已經存在或是否需要更新。

如果您需要爲每個用戶單獨保存數據,您可以按照之前編寫的方式創建單獨的類UserDataStore,但不使用鎖和實例()方法。例如:

class UserDataStore: 

    def __init__(self, user_id, file_count, mw_count, ....): 
     self.user_id = user_id 
     self.file_count = file_count 
     self.mw_count = mw_count 

     ......... 

以這種方式,您將爲每個用戶擁有不同的實例。

您可以使用的另一個解決方案是使用Redis來存儲您的數據。只需將數據字典存儲在密鑰「db_data」下並隨時檢索。 (如果用戶的數據可以使用鍵'db_data:')。