Tornado源码浅探分析(三)之_ApplicationRou

2019-04-11  本文已影响0人  随风而去_c0e8

url路由

tornado代码文档中提到,“A collection of request handlers that make up a web application“。其实更加detail一点的说法应该是,”A collection of request handlers and a url route talbe that make up a web application”。一个web应用是由一个路由表和请求处理器集合组成。

我们注意到,概念上的抽象,web application的底层才是http server(另外一个著名的python开发框架django也采取同样的概念,命令”python manage.py startapp blog”,生成一个web application)。

其实路由表具有非常重要的作用,卸耦了http server层和web application层。

在web框架中,路由表中的任意一项是一个元组,每个元组包含pattern(模式)和handler(处理器)。当httpserver接收到一个http请求,server从接收到的请求中解析出url path(http协议start line中),然后顺序遍历路由表,如果发现url path可以匹配某个pattern,则将此http request交给web应用中对应的handler去处理。

由于有了url路由机制,web应用开发者不必和复杂的http server层代码打交道,只需要写好web应用层的逻辑(handler)即可。

Application

Application类位于web.py,一个Application类的实例相当于一个web应用。前面提到一个web应用是由路由表和处理器(hanlders)组成。当然存储路由表最合适的地方是Application类的实例。

application = tornado.web.Application([
        (r"/", MainHandler),
    ])
    http_server = tornado.httpserver.HTTPServer(application)
    http_server.listen(options.port)
    tornado.ioloop.IOLoop.current().start()

上面的代码,把一个路由表(一个列表)作为参数,传递给Application类的构造函数,创建了一个实例,然后再把这个实例传递给http_server。那么当客户端发起”get /”请求的时候,http server接收到这个请求,在路由表中匹配url pattern,最后交给MainHandler去处理。

_ApplicationRouter

在tornado中路由是由内部类_ApplicationRouter实现的。

class Application(ReversibleRouter):
        ...
        ...
       #路由的代码,其他忽略
        self.wildcard_router = _ApplicationRouter(self, handlers)
        self.default_router = _ApplicationRouter(self, [
            Rule(AnyMatches(), self.wildcard_router)
        ])

--------------------------------------------我是个可爱的分割线----------------------------------------

_ApplicationRouter继承了(ReversibleRuleRouter),内部函数基本都是调用父类的函数处理


ReversibleRuleRouter继承了(ReversibleRouter,RuleRouter),
process_rule调用父类方法,reverse_url


RuleRouter内容比较少,可以忽略,主要就是RuleRouter


RuleRouter,RuleRouter都是继承基础类Router



Router的主要函数start_request,具体是干什么的之后再研究

上一篇下一篇

猜你喜欢

热点阅读