Python 无法理解HTTP请求处理程序函数如何能够访问Tornado中的应用程序对象
我正在阅读《龙卷风导论》一书,下面是作者解释如何阅读mongodb数据库的示例Python 无法理解HTTP请求处理程序函数如何能够访问Tornado中的应用程序对象,python,tornado,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",
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类的实例能够访问应用程序类实例。这是我无法理解的。以下是WordHandler函数中的行:
coll = self.application.db.words
对象不会传递给它,除了这一行之外,代码上没有“应用程序”出现。那么它是如何访问它的呢?tornado.httpserver.httpserver、WordHandler和应用程序是如何链接在一起的?我对tornado一无所知,但我认为框架负责实例化处理程序,并在实例化时将应用程序传递给它们 事实上,您可以在代码中看到这一点:
应用程序。\uuu call\uu()
查找与URL匹配的处理程序,并实例化它:
因此,应用程序(即self
)作为参数传递给RequestHandler实例化,因为我们处于应用程序的方法中。在处理程序\uuuu init\uuuu
中,我们看到:
handler = spec.handler_class(self, request, **spec.kwargs)
def __init__(self, application, request, **kwargs):
super(RequestHandler, self).__init__()
self.application = application