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