我在Tornado中有一个处理程序,它有一个get()和post()方法。 get方法获取一些数据库信息并使用html呈现它。 post方法用于加载页面后的ajax调用,并且需要使用get()方法收集的DB数据。
我的问题是,如果我将需要在get()和post()之间共享的变量设置为实例变量(即在get()方法中设置self.variable =“foobar”),那么post()方法无法识别那些实例变量是否存在。我发现的唯一解决方法是将这些变量设置为全局类变量,并在get()中使用MyHandler.variable =“foobar”重置它们。但这似乎是一个hackish解决方案。
使用:
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 :(得分: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)
通过这种方式,您只有一个商店类实例可以为您保存信息。
您可以实现自己的方法来处理所需的信息(您可以使用 init 方法),而不是store_data方法。您还可以添加一种方法,该方法将告诉您数据是否已存在或是否需要更新数据。
如果您需要为每个用户单独保存数据,您可以按照我之前编写的方式创建单独的类UserDataStore,但不使用lock和instance()方法。例如:
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:')。