在RequestHandler中获取实例变量的引用

12 投票
1 回答
4582 浏览
提问于 2025-04-18 07:46

在写一个 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

我需要在 SomeHandlerpost() 方法中访问 MyServerref_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()

撰写回答