在RequestHandler中获取实例变量的引用
在写一个 Tornado 的 Http 服务器时,我遇到了一个问题:我想在主类中访问一个实例变量,这个变量里包含了 Tornado 应用对象和启动方法,而这个主类和一个单独的请求处理器(RequestHandler)对象是分开的。下面是一个简单的例子:
class MyServer(object):
def __init__(self):
self.ref_object = 0
self.application = #Add tornado.web.applicaiton here
def change_ref_object(self, ref_obj):
self.ref_object = ref_obj
def start(self):
#start the server
pass
class SomeHandler(tornado.web.RequestHandler):
def post(self):
#Yada, yada, yada
#Call method on Myserver's ref_object
pass
我需要在 SomeHandler
的 post()
方法中访问 MyServer
的 ref_object
实例,并且我需要确保在 SomeHandler
中访问的 ref_object
是同一个对象,如果它在 change_ref_object()
方法中被改变了。
在创建 Python Tornado 网络服务器(应用)时,SomeHandler
只是作为一个类被引用,但不清楚如何访问 SomeHandler
的实例,以便在 MyServer
中改变它的临时 ref_object
。
归根结底,我不太明白 SomeHandler
的实例会在 MyServer
的范围内(或者更具体地说,在 MyServer
的应用对象中)存在在哪里。
1 个回答
17
当你创建你的 Application
对象时,可以通过把 ref_object
实例放进一个字典里,作为元组的第三个参数传给 SomeHandler
。这样做通常是在定义处理器的时候使用的。在 MyServer.__init__
方法里,你可以这样做:
self.application = tornado.web.Application([
(r"/test", SomeHandler, {"ref_object" : self.ref_object}),
])
接着,给 SomeHandler
添加一个 initialize
方法:
class SomeHandler(tornado.web.RequestHandler):
def initialize(self, ref_object):
self.ref_object = ref_object
def post(self):
self.ref_object.method()