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

jab*_*jab 8 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
Run Code Online (Sandbox Code Playgroud)

我需要访问的ref_object实例MyServerpost()的方法SomeHandler,我需要确保访问在ref_object SomeHandler是相同的对象,如果它在改变change_ref_object().

Somehandler在创建python tornado web服务器(应用程序)时仅被引用为类,并且不清楚如何SomeHandler在更改其时更改其临时ref_object 的实例MyServer.

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

dan*_*ano 16

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

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

然后添加一个initialize方法SomeHandler:

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

    def post(self):
       self.ref_object.method()
Run Code Online (Sandbox Code Playgroud)