欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Tornado6.0.3-源码分析之Application

程序员文章站 2022-07-15 12:13:45
...

一、回顾联结HTTPServer

从前面上一节对HTTPServer的源码分析,我们知道Application类需要满足继承至HTTPServerConnectionDelegate类,并实现其start_request方法,该方法返回一个HTTPMessageDelegate类的实例,从而后续HTTPServer可以把相应的http的请求提交给HTTPMessageDelegate类相关的实例去做逻辑处理;

二、Application的类间关系

通过查看源码,可以知道,Application并不是直接继承至HTTPServerConnectionDelegate类,而是在这其中穿插实现了一个Router类的相关功能,这个Router类就好比于是网络中的路由器的作用是一样的,其目的就是针对不同的url请求,找到相应的路由规则,提交给对应的处理方去进行逻辑处理。因为一个Web服务,在真实实现上,肯定是需要定义不同的url资源和相应的处理逻辑的。
先看下Application的继承图。Application类继承至ReversibleRouter类,而ReversibleRouter类继承至Router类,Router类继承至HTTPServerConnectionDelegate类,从而完成Application类继承至HTTPServerConnectionDelegate类的实现。接下来我们从Router类开始讲起。
Tornado6.0.3-源码分析之Application

2.1 Router类

Tornado6.0.3-源码分析之Application
从类的注释也已经明白这个类的作用了,它本身是定义一个路由功能的接口类,规定其子类要实现一个find_handler接口,来针对每个具体的http请求(HTTPServerRequest类实例),匹配找到最合适的处理对象(HTTPMessageDelete类实例),同时Router又实现了HTTPServerConnectionDelegate类的start_request接口,返回一个_RoutingDelegate类对象。这个_RoutingDelegate类直接继承至HTTPMessageDelegate类,用于后续的实际的HTTP消息的处理,即对于更低一层的HTTPServer类来说,HTTPServer类会把后续的http请求提交给_RoutingDelegate对象来处理,_RoutingDelegate类内部具体的功能,我们等会再分析。

进一步遍历查看Router类的子类,可以看到其目前只有两个子类:ReversibleRouter类和RuleRouter类。这两个子类,就相当于把Router类功能区分为两大块:

  • ReversibleRouter类
    该类本身也还是抽象的接口定义类,主要作用是支持命名的路由,其对子类又重新要求实现一个reverse_url的接口。
  • RuleRouter类
    该类是对路由规则查找的接口定义类。这里先不管这个类的子类实现,等会以实例讲解时,再具体说明。

2.2 RequestHandler类和Application类

RequestHandler类是对http请求的处理类,这是一个基础类,需要应用程序继承该类,并至少实现其中的一种HTTP方法(“GET”, “HEAD”, “POST”, “DELETE”, “PATCH”, “PUT”, “OPTIONS”)。一系列的RequestHandler类的实例构成的Web应用,就是一个Application类对象。就是说,实际上,对于一个特定的url资源,每一个http请求,要怎么具体处理,由继承自RequestHandler子类来实现,而Application类对象的作用就是当用户该这个url资源时,正确匹配找到url所对应的RequestHandler对象。所以Application就相当于处理容器一样,里面放置着很多具体的处理执行对象;

三、以例子带动分析

import tornado.ioloop
import tornado.web

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

def make_app():
    return tornado.web.Application([
        (r"/", MainHandler),
    ])

if __name__ == "__main__":
    # 初始化并返回一个web的应用对象app
    app = make_app()
    # 设置该web服务的监听端口是8888
    app.listen(8888)
    # 启动ioloop循环,即启动web服务功能
    tornado.ioloop.IOLoop.current().start()

前面的两点只是从整体上先简单说明下tornado的web应用的情况。接下来在具体的代码分析上,我们以这个例子为主。这个程序的作用是:启动一个Web服务,这个web服务的功能就是当有人访问8888端口的根目录资源时,响应Hello, world。通俗点讲,就是当你在本地浏览器输出http://127.0.0.1:8888,或者http://127.0.0.1:8888/ 这样的访问链接时,给你响应返回一个Hello, world。

这里定义了一个MainHandler类,并实现其中的get方法,就是当调用这个类的Get方法时,其对应的http响应是返回一个Hello, world字符串。
make_app方法是初始化并返回一个Application类实例。

未完待续。。。

相关标签: Tornado