我正在阅读“龙卷风简介”一书,以下是作者解释如何阅读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如何链接在一起?
答案 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