我在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)
....
对于每个请求,您都会得到一个新的AdminHandler实例 - 因此,在调用get和post函数之间不会共享任何状态,就像两次连续调用get之间不会共享状态一样。 。 – dano
HTTP应该是无状态的。不要在该类上存储GET数据; POST请求完全独立且独立,您收到的GET和POST请求的顺序不一定与一个客户端相关。 –
在POST中进行*相同的数据库查询*。 –