无法理解HTTP请求处理函数如何能够访问Tornado中的应用程序对象

时间:2013-12-17 10:52:03

标签: python tornado

我正在阅读“龙卷风简介”一书,以下是作者解释如何阅读mongodb数据库的示例。

import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web

import pymongo

from tornado.options import define, options
define("port", default=8000, help="run on the given port", type=int)

class Application(tornado.web.Application):
    def __init__(self):
        handlers = [(r"/(\w+)", WordHandler)]
        conn = pymongo.Connection("localhost", 27017)
        self.db = conn["example"]
        tornado.web.Application.__init__(self, handlers, debug=True)

class WordHandler(tornado.web.RequestHandler):
    def get(self, word):
        coll = self.application.db.words
        word_doc = coll.find_one({"word": word})
        if word_doc:
            del word_doc["_id"]
            self.write(word_doc)
        else:
            self.set_status(404)
            self.write({"error": "word not found"})

def main():
    tornado.options.parse_command_line()
    http_server = tornado.httpserver.HTTPServer(Application())
    http_server.listen(options.port)
    tornado.ioloop.IOLoop.instance().start()

if __name__ == "__main__":
    main()

我理解代码及其工作原理,但我无法理解一件事。 WordHandler类的实例能够访问Application类实例。这是我无法理解的。以下是WordHandler函数中的一行:

coll = self.application.db.words

对象没有传递给它,除了那条线,代码上没有“应用程序”。然后它是如何访问它的? tornado.httpserver.HTTPServer,WordHandler和Application如何链接在一起?

1 个答案:

答案 0 :(得分:1)

我对Tornado一无所知,但我认为框架负责实例化处理程序,并在应用程序执行时将其传递给它们。

实际上你可以在代码中看到这一点:Application.__call__()找到与URL匹配的处理程序,并将其实例化like this

handler = spec.handler_class(self, request, **spec.kwargs) 

所以应用程序 - 即self,因为我们在应用程序的方法中 - 作为参数传递给RequestHandler实例化。在处理程序__init__中,我们看到this

def __init__(self, application, request, **kwargs):
    super(RequestHandler, self).__init__()

    self.application = application