Tornado 特点

Tornado是一个用Python写的相对简单的、不设障碍的Web服务器架构,用以处理上万的同时的连接口,让实时的Web服务通畅起来。虽然跟现在的一些用Python写的Web架构相似,比如Django,但Tornado更注重速度,能够处理海量的同时发生的流量。 
FriendFeed的联合创始人Bret Taylor的博客里介绍了更多,他说:把Tornado开源,FriendFeed和Facebook期望第三方能够用以建筑实时的Web服务。其具体的工作原理如上图,看起来很像是FriendFeed的评论系统。 

Taylor认为Tornado的三个关键部分是: 
         完整的用以构建网站的基础模块。Tornado包含内置的用以解决网络开发最难和最烦的功能模块,包括模板、signed cookies、用户认证、地方化(localization)、aggressive static file caching, cross-site request forgery protection,以及类似Facebook Connect的第三方认证。开发者可以随取所需,并且自由组合,甚至把Tornado与其他架构组合。 
实时服务。Tornado支持大量的同时发生的信息连接。用Tornado,能够通过HTTP或者Long Polling方便的书写实时服务。要知道,每一个FriendFeed的活跃用户都保持有一个连通FriendFeed服务器的开放通路。 
高效能。Tornado比大多数用Python写的Web架构更快。根据一些实验,Tornado的速度是一般架构的4倍。

 

  Tornado 支持二种模式 一种是串行访问处理,异步非阻塞。当客户端访问web,tornado 可以自行定义前面2个的处理方式。天生支持RESTful

  安装

  pip install tornado

  官方:http://www.tornadoweb.org/en/stable/

 

 

一 、HELLO word 

 1 import tornado.ioloop
 2 import tornado.web
 3 
 4 class MainHandler(tornado.web.RequestHandler):
 5     def get(self):
 6         self.write("Hello, world")
 7 
 8 def make_app():
 9     return tornado.web.Application([
10         (r"/index", MainHandler),
11     ])
12 
13 if __name__ == "__main__":
14     app = make_app()
15     app.listen(8888)
16     tornado.ioloop.IOLoop.current().start()

访问 ip:8888/index 测试内容

 

 

配置模板

返回html页面

#_*_coding:utf-8_*_
import tornado.ioloop
import tornado.web

#通过字典定义的方式定义配置文件属性,
settings = {
    'template_path':'template',
}


class MainHandler(tornado.web.RequestHandler):
    def get(self):
        #self.write("Hello, world")
        #返回模板中的页面
        self.render('index.html')

def make_app():
    #把setting这个配置参数带入到方法中
    return tornado.web.Application([
        (r"/index", MainHandler),],**settings)

if __name__ == "__main__":
    app = make_app()
    app.listen(8888)
    tornado.ioloop.IOLoop.current().start()

然后就可以测试页面了,非常的简单

这里介绍render都做了什么
class MainHandler(tornado.web.RequestHandler):
               def get(self):

                             1先找到template的路径

                             2根据路径找到对应的html页面(拼接)

                             3python open方法读取这个html页面内容,将内容读取到了内存中。实际上读出来的其实就是一个字符串

                             4 self.write(open('html').read()) 读出这个文件然后写回(self.write方法)

                             5self.write用socket的send方法,将字符串发送给客户端用户(这里会将这个字符串塞进一个双向队列里面,send方法回去队列中去数据然后发送给客户端),用户就可以看见web页面了(这个就是一个简单的过程)

                             dic ={ 'name'='aaaa' }

                              这里在说一下模板渲染,上面定义了一个字典dic。那过程就需要多加一步了。

                             在上面4步:

                                     4open('html').read() 先把文件读取出来

                                     5渲染html页面(实际就是一个很长的字符串),替换字符串中的特殊模板语言(在html文件中也会有模板语言{{ name }},这个key可以dic中的key对应上)

                                     6self.write 

                      self.render('index.html')

                      #self.render('index.html',**dic)  渲染必须将字典当参数一起传递

 

 

路由系统

#_*_coding:utf-8_*_
import tornado.ioloop
import tornado.web

#通过字典定义的方式定义配置文件属性,
settings = {
    'template_path':'template',
}


class MainHandler(tornado.web.RequestHandler):
    def get(self):
        dic={
            'name':'abc'
        }
        self.render('index.html',**dic)

class Home(tornado.web.RequestHandler):
    def get(self):
        self.render('home.html')

class news(tornado.web.RequestHandler):
    #接受从url传递过来的参数,nid是从url中传递过来的
    def get(self,nid):
        self.write(str(nid))
'''
 (r"/news/(\d+)",news),这里也可以用正则匹配.想要当参数传递必须()中写表达式
'''
def make_app():
    #把setting这个配置参数带入到方法中
    return tornado.web.Application([
        (r"/index", MainHandler),
        (r"/home",Home),
        (r"/news/(\d+)",news),
    ],**settings)

if __name__ == "__main__":
    app = make_app()
    app.listen(8888)
    tornado.ioloop.IOLoop.current().start()

 

匹配二级域名,这个是Tornado独有的,一般都是匹配xxx.xxxx.xxx/后面的参数,现在要匹配 psp.xxx.com/index  ,匹配psp 这个前缀

#_*_coding:utf-8_*_
import tornado.ioloop
import tornado.web

#通过字典定义的方式定义配置文件属性,
settings = {
    'template_path':'template',
}

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        dic={
            'name':'abc'
        }
        self.render('index.html',**dic)

class psphandler(tornado.web.RequestHandler):
    def get(self):
        self.write("psp.tb.com/index")
app=tornado.web.Application([
        (r"/index", MainHandler),
    ],**settings)

#对app的add_handlers方法在增加一个匹配项,如果匹配上就掉对应的方法。当url过来的时候如果psp.tb.com匹配不上还是回去其它定义的规则中继续匹配
app.add_handlers('psp.tb.com',[
    (r"/index",psphandler),
])

if __name__ == "__main__":
    app.listen(8888)
    tornado.ioloop.IOLoop.current().start()

测试结果:

路由psp

Tornado(一)

 路由正常规则

Tornado(一)

 

 

静态文件

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link href="{{static_url("commons.css")}}" rel="stylesheet" />
</head>
<body>
<h1>index.html</h1>
<h1>{{ name }}</h1>
</body>
</html>
index.html

相关文章: