资讯专栏INFORMATION COLUMN

【Tornado源码阅读笔记】tornado.web.Application

Cympros / 1283人阅读

摘要:从的开始分析的源码很容易可以看出,通过继承类定义自己的处理类,来处理请求。类的对象来处理的路由将于处理类组成,关联起来。调用的来将和绑定在一起初始化一个的对象,由其来处理请求的路由,来利用建立的规则。

从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的具体用法

初始化transforms(HTTP传输压缩等,默认GZipContentEncoding 和 ChunkedTransferEncoding 。也可以自己实现,需要实现 transform_first_chunk 和 transform_chunk 接口,RequestHandler 中的 flush 调用,剖析RequestHandler时详细介绍),UI模块

通过settings的值来初始化静态文件处理Handler,包括:

static_path

static_url_prefix

static_handler_class

static_handler_args

static_hash_cache

初始化其他settings

调用add_handlers方法添加handlers。

加载自动重新加载模块(当检测到代码被修改后重构启动)

二、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建立的规则。

原文连接

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/37486.html

相关文章

  • Tornado学习笔记(1)

    摘要:对参数类型进行检验,这里为当参数类型不合适是会抛出一个异常。将使用的第二个参数值作为默认值。而请求将从格式中取得指定的文本。这里需要正则表达式相关的知识,到了后面的学习中,必要时再去深入学习。到目前我们使用了,还支持任何合法的请求。 参考书籍《Introduction to Tornado》1.1 Tornado是什么?Tornado是使用Python编写的一个强大的、可扩展的Web服...

    ChanceWong 评论0 收藏0
  • Tornado学习笔记(2)

    摘要:而这里的方法则是告诉来读取模板文件,并将结果返回给浏览器。依旧可以使用,等条件控制语句,但是要记得以结尾。替换字符串中的字符为编码形式。模块模块是封装模板中包含的标记样式以及行为的可复用组件。 表单和模板 import os.path import tornado.httpserver import tornado.ioloop import tornado.options impo...

    tianyu 评论0 收藏0
  • tornado学习笔记(1)HTTP请求及API测试

    摘要:首先是的请求接着是的请求在本次分享中,我们介绍了的请求,包括请求,并将介绍如何使用和来测试该本次分享到此结束,欢迎大家交流   Tornado是现在的主流 Web 服务器框架,它与大多数 Python 的框架有着明显的区别:它是非阻塞式服务器,而且速度相当快。得利于其非阻塞的方式和对 epoll 的运用,Tornado 每秒可以处理数以千计的连接,这意味着对于实时 Web 服务来说,T...

    EddieChan 评论0 收藏0
  • tornado6与python3.7 异步新姿势

    摘要:这是我重新复习的原因放弃了之前自己实现的全面拥抱的这个改动是非常大的而且阅读的源码可以发现其中大部分函数都支持了类型检验和返回值提示值得阅读 废话不多说,直接上代码 __auth__ = aleimu __doc__ = 学习tornado6.0+ 版本与python3.7+ import time import asyncio import tornado.gen import t...

    maxmin 评论0 收藏0
  • Tornado 简单入门教程(一)——Demo1

    摘要:也就是说用于设定与处理类间的映射关系。在中,默认使用和函数分别处理两种请求。因为表单仍提交到当前页面,所以还是由处理。载入时间相关的的一个类,获取当前时间戳。获取数据库中的名为的。 前面的话 Demo1是一个简单的博客系统(=。=什么网站都叫系统)。我们从这个简单的系统入手,去了解P+T+M网站的内部逻辑,并记住一些规则,方便我们进一步自己开发。 规则这个词特意打上了双引号,目的是...

    solocoder 评论0 收藏0

发表评论

0条评论

Cympros

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<