【Tornado源码阅读笔记】tornado.web.Application
admin
2023-07-31 01:52:06
0

从tornado的 Hello,world 开始分析tornado的源码

pythonimport tornado.ioloop
import tornado.web

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write(\"Hello, world\")

application = tornado.web.Application([
    (r\"/\", MainHandler),
])

if __name__ == \"__main__\":
    application.listen(8888)
    tornado.ioloop.IOLoop.instance().start()

很容易可以看出,通过继承RequestHandler类定义自己的处理类,来处理请求。Application类的对象来处理URI的路由(将URIr\"/\"于处理类MainHandler组成tuple,关联起来)。

tornado.web.Application类

一、__init__

简化版代码:

pythondef __init__(self, handlers=None, default_host=\"\", transforms=None,
             **settings):
    if transforms is None:
        self.transforms = []
        if settings.get(\"compress_response\") or settings.get(\"gzip\"):
            self.transforms.append(GZipContentEncoding)
    else:
        self.transforms = transforms
    ......
    self.ui_modules = {\'linkify\': _linkify,
                       \'xsrf_form_html\': _xsrf_form_html,
                       \'Template\': TemplateModule,
                       }
    self.ui_methods = {}
    self._load_ui_modules(settings.get(\"ui_modules\", {}))
    self._load_ui_methods(settings.get(\"ui_methods\", {}))

    if self.settings.get(\"static_path\"):
        ......
    if handlers:
        self.add_handlers(\".*$\", handlers)

    if self.settings.get(\'debug\'):
        self.settings.setdefault(\'autoreload\', True)
        ......
    # Automatically reload modified modules
    if self.settings.get(\'autoreload\'):
        from tornado import autoreload
        autoreload.start()

参数handlers是一个list,list里每个object是一个URLSpec的对象或tuple。tuple可以是二到四个element,分别是URI的正则、handler类、用于初始化URLSpec的kwargs、handler的name。
(下面add_handlers详细说明)

参数settings是一个dict,所有settings的具体用法

  1. 初始化transforms(HTTP传输压缩等,默认GZipContentEncoding 和 ChunkedTransferEncoding 。也可以自己实现,需要实现 transform_first_chunk 和 transform_chunk 接口,RequestHandler 中的 flush 调用,剖析RequestHandler时详细介绍),UI模块
  2. 通过settings的值来初始化静态文件处理Handler,包括:
    • static_path
    • static_url_prefix
    • static_handler_class
    • static_handler_args
    • static_hash_cache
  3. 初始化其他settings
  4. 调用add_handlers方法添加handlers。
  5. 加载自动重新加载模块(当检测到代码被修改后重构启动)

二、add_handle

pythondef add_handlers(self, host_pattern, host_handlers):
    if not host_pattern.endswith(\"$\"):
        host_pattern += \"$\"
    handlers = []
    if self.handlers and self.handlers[-1][0].pattern == \'.*$\':
        self.handlers.insert(-1, (re.compile(host_pattern), handlers))
    else:
        self.handlers.append((re.compile(host_pattern), handlers))

    for spec in host_handlers:
        if isinstance(spec, (tuple, list)):
            assert len(spec) in (2, 3, 4)
            spec = URLSpec(*spec)
        handlers.append(spec)
        if spec.name:
            if spec.name in self.named_handlers:
                app_log.warning(
                    \"Multiple handlers named %s; replacing previous value\",
                    spec.name)
            self.named_handlers[spec.name] = spec

将host_pattern和handlers,组成tuple加到self.handlers的末尾但是在匹配所有域名的tuple前。

spec = URLSpec(*spec)易看出初始化Application的时候的第一个参数存的tuple是用来初始化URLSpec的所以参数顺序应该和URLSpec要求的一样(def __init__(self, pattern, handler, kwargs=None, name=None))。

用过第四个参数name来构造反响代理,储存在Application的named_handlers(dict)里。

hello world里调用了Application的listentornado.ioloop.IOLoop.instance().start()(以后会详细介绍ioloop),来真正启动。

三、listen

pythondef listen(self, port, address=\"\", **kwargs):
        from tornado.httpserver import HTTPServer
        server = HTTPServer(self, **kwargs)
        server.listen(port, address)

实例化一个HTTPServer,将application绑定上去。HTTPServer调用application的start_request来将application和connection绑定在一起初始化一个_RequestDispatcher的对象,由其来处理请求的路由,来利用add_handler建立的规则。

原文连接

相关内容

热门资讯

Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
Apache Doris 2.... 亲爱的社区小伙伴们,我们很高兴地向大家宣布,Apache Doris 2.0.0 版本已于...
项目管理和工程管理的区别 项目管理 项目管理,顾名思义就是专注于开发和完成项目的管理,以实现目标并满足成功标准和项目要求。 工...