gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 18:40:22 25 4
gpt4 key购买 nike

我正在阅读《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

该对象未传递给它,除了该行之外,代码中没有任何地方出现“应用程序”。那么它如何能够访问它呢? torchado.httpserver.HTTPServer、WordHandler 和 Application 是如何链接在一起的?

最佳答案

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

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

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

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

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

self.application = application

关于python - 无法理解 HTTP 请求处理函数如何访问 Tornado 中的应用程序对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20632203/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com