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

时间:2014-05-28 03:51:43

标签: python tornado

在编写龙卷风Http Server时,我在主类中访问实例变量时遇到问题,该实例变量包含来自单独的RequestHandler对象的tornado应用程序对象以及start方法。考虑以下粗略的例子,

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

我需要在MyServer的{​​{1}}方法中访问post()的ref_object实例,我需要确保SomeHandler中访问的ref_object是同一个对象如果它在SomeHandler中发生了变化。

在创建python龙卷风Web服务器(应用程序)时,Somehandler仅作为类引用,并且不清楚如何在change_ref_object()中更改其临时ref_object时更改其临时ref_object的实例{1}}。

这基本上归结于我不了解SomeHandler的实例在MyServer(或者特别是MyServer的应用程序对象)范围内的位置。

1 个答案:

答案 0 :(得分:16)

创建Application对象时,可以将ref_object实例传递给SomeHandler,方法是将其放在dict中,作为通常用于定义处理程序的元组的第三个参数。所以,在MyServer.__init__

self.application = tornado.web.Application([
    (r"/test", SomeHandler, {"ref_object" : self.ref_object}),
])

然后将initialize方法添加到SomeHandler

class SomeHandler(tornado.web.RequestHandler):
    def initialize(self, ref_object):
        self.ref_object = ref_object

    def post(self):
       self.ref_object.method()