美文网首页
Tornado源码浅探分析(三)之_ApplicationRou

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

作者: 随风而去_c0e8 | 来源:发表于2019-04-11 13:25 被阅读0次

    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,具体是干什么的之后再研究

    相关文章

      网友评论

          本文标题:Tornado源码浅探分析(三)之_ApplicationRou

          本文链接:https://www.haomeiwen.com/subject/pcxsmqtx.html