Tornado6.0.3-源码分析之Application
一、回顾联结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类开始讲起。
2.1 Router类
从类的注释也已经明白这个类的作用了,它本身是定义一个路由功能的接口类,规定其子类要实现一个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类实例。
未完待续。。。
上一篇: Leetcode - 89格雷编码
下一篇: tornado 跨域