tornado源码阅读--Application篇

主要模块

  • web - FriendFeed 使用的基础 Web 框架,包含了 Tornado 的大多数重要的功能
  • database - 对 MySQLdb 的简单封装,使其更容易使用
  • template - 基于 Python 的 web 模板系统
  • httpclient - 非阻塞式 HTTP 客户端,它被设计用来和 web 及 httpserver 协同工作
  • auth - 第三方认证的实现(包括 Google OpenID/OAuth、Facebook Platform、Yahoo BBAuth、FriendFeed OpenID/OAuth、Twitter OAuth)

底层模块

  • httpserver - 服务于 web 模块的一个非常简单的 HTTP 服务器的实现
  • iostream - 对非阻塞式的 socket 的简单封装,以方便常用读写操作
  • ioloop - 核心的 I/O 循环
从tornado的官方文档中,我们能够知道对于tornado来说最主要的几个模块主要是web、httpclient、httpserver、iostream和ioloop这几个模块。所以现在我们可以按照顺序来庖丁解牛。




Tornado框架设计模型

在深入到模块进行分析之前,首先来看看Tornado的设计模型




神奇的Hello World

首先,我们还是从最神奇的Demo中来开始,一步一步来看看,这个程序是怎么来运行的。

import tornado.ioloop
import tornado.web

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

application = tornado.web.Application([
    (r"/", MainHandler),
])

if __name__ == "__main__":
    application.listen(8888)
    tornado.ioloop.IOLoop.instance().start()
在这个Demo中,最重要的是 Application的这样的一个类,这个类有什么用和是怎么定义的,我们直接看代码。


这个部分是APPlication的初始化。

 
  
class  Application ( object ):
     def  __init__ ( self ,  handlers = None ,  default_host = "" ,  transforms = None ,
                  wsgi = False ,  ** settings ):
          /*********
               这些都是一些初始化的操作,可以省略。。。
               最主要的是查看调用下面self.add_handlers来处理  
               handlers = [ [    (r"/", MainHandler),  )]
          **********/
         self . handlers  =  []
 
  
         self . named_handlers  =  {}

         if  handlers :
             self . add_handlers ( ".*$" ,  handlers )     #初始化一下根据不用的URL调用不同的
                                                                   # RequestHandler类,具体下面有解释

     
     def  listen ( self ,  port ,  address = "" ,  ** kwargs ):
         # import is here rather than top level because HTTPServer
         # is not importable on appengine
         from  tornado.httpserver  import  HTTPServer
         server  =  HTTPServer ( self ,  ** kwargs )      #启动的还是tornado默认的内嵌服务
         server . listen ( port ,  address )


      ef  add_handlers ( self ,  host_pattern ,  host_handlers ):  #这个函数主要是做个路由功能,
                                                                                     #初始化一下根据不用的URL调用不同函数               
         if  not  host_pattern . endswith ( "$" ):
             host_pattern  +=  "$"
         handlers  =  []

         if  self . handlers  and  self . handlers [ - 1 ][ 0 ] . pattern  ==  '.*$' :
             self . handlers . insert ( - 1 ,  ( re . compile ( host_pattern ),  handlers ))
         else :
             self . handlers . append (( re . compile ( host_pattern ),  handlers ))

         for  spec  in  host_handlers :
             if  isinstance ( spec ,  ( tuple ,  list )):
                 assert  len ( spec )  in  ( 2 ,  3 ,  4 )
                 spec  =  URLSpec ( * spec )
             handlers . append ( spec )
             if  spec . name :
                 if  spec . name  in  self . named_handlers :
                     app_log . warning (
                         "Multiple handlers named  %s ; replacing previous value" ,
                         spec . name )
                 self . named_handlers [ spec . name ]  =  spec
          
          #这一部分主要是把传入的handlers传入的一个处理,
          #根据debug信息,处理的结果如下:
          #






定义Application的时候主要是做一个一些变量的初始化。


 第二部分:
Appliction.listen(8888)
这个部分主要是调用 HTTPServer对象进行监听.
直接上源码:

 
  
def  listen ( self ,  port ,  address = "" ,  ** kwargs ):
         # import is here rather than top level because HTTPServer
         # is not importable on appengine
         from  tornado.httpserver  import  HTTPServer
         server  =  HTTPServer ( self ,  ** kwargs )
         server . listen ( port ,  address )


ok,这部分初始化完了,主要是根据运行一步一步的抽丝剥茧,下一步的应该是去剖析 HTTPServer这个类对象了


这是自己第一次写技术Blog,没准有不入大神大婶发眼的,多多指正,欢迎大家多交流。
QQ:625106674
Email: ky150@126.com

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值