概述

Tornado 是 FriendFeed 使用的可扩展的非阻塞式 web 服务器及其相关工具的开源版本。这个 Web 框架看起来有些像web.py 或者 Google 的 webapp,不过为了能有效利用非阻塞式服务器环境,这个 Web 框架还包含了一些相关的有用工具 和优化。

Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快。得利于其 非阻塞的方式和对 epoll 的运用,Tornado 每秒可以处理数以千计的连接,这意味着对于实时 Web 服务来说,Tornado 是一个理想的 Web 框架。我们开发这个 Web 服务器的主要目的就是为了处理 FriendFeed 的实时功能 ——在 FriendFeed 的应用里每一个活动用户都会保持着一个服务器连接。(关于如何扩容 服务器,以处理数以千计的客户端的连接的问题,请参阅 C10K problem。)

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

下载安装:

1 2 3 4 pip3 install tornado   源码安装 https: / / pypi.python.org / packages / source / t / tornado / tornado - 4.3 .tar.gz

框架使用

一、快速上手

+ View Code

执行过程:

  • 第一步:执行脚本,监听 8888 端口
  • 第二步:浏览器客户端访问 /index  -->  http://127.0.0.1:8888/index
  • 第三步:服务器接受请求,并交由对应的类处理该请求
  • 第四步:类接受到请求之后,根据请求方式(post / get / delete ...)的不同调用并执行相应的方法
  • 第五步:方法返回值的字符串内容发送浏览器
Python开发【第十五篇】:Web框架之Tornado 随笔 第1张  异步非阻塞示例

二、路由系统

路由系统其实就是 url 和 类 的对应关系,这里不同于其他框架,其他很多框架均是 url 对应 函数,Tornado中每个url对应的是一个类。

+ View Code

Tornado中原生支持二级域名的路由,如:

Python开发【第十五篇】:Web框架之Tornado 随笔 第2张

 

三、模板引擎

Tornao中的模板语言和django中类似,模板引擎将模板文件载入内存,然后将数据嵌入其中,最终获取到一个完整的字符串,再将字符串返回给请求者。

Tornado 的模板支持“控制语句”和“表达语句”,控制语句是使用 {% 和 %} 包起来的 例如 {% if len(items) > 2 %}。表达语句是使用 {{ 和 }} 包起来的,例如 {{ items[0] }}

控制语句和对应的 Python 语句的格式基本完全相同。我们支持 ifforwhile 和 try,这些语句逻辑结束的位置需要用 {% end %} 做标记。还通过 extends 和 block 语句实现了模板继承。这些在 template 模块 的代码文档中有着详细的描述。

注:在使用模板前需要在setting中设置模板路径:"template_path" : "tpl"

1、基本使用

Python开发【第十五篇】:Web框架之Tornado 随笔 第3张  app.py Python开发【第十五篇】:Web框架之Tornado 随笔 第4张  index.html Python开发【第十五篇】:Web框架之Tornado 随笔 第5张  其他方法

2、母版

Python开发【第十五篇】:Web框架之Tornado 随笔 第6张  layout.html Python开发【第十五篇】:Web框架之Tornado 随笔 第7张  index.html

3、导入

Python开发【第十五篇】:Web框架之Tornado 随笔 第8张  header.html Python开发【第十五篇】:Web框架之Tornado 随笔 第9张  index.html

4、自定义UIMethod以UIModule

a. 定义

Python开发【第十五篇】:Web框架之Tornado 随笔 第10张  uimethods.py Python开发【第十五篇】:Web框架之Tornado 随笔 第11张  uimodules.py

b. 注册

Python开发【第十五篇】:Web框架之Tornado 随笔 第12张  View Code

c. 使用

Python开发【第十五篇】:Web框架之Tornado 随笔 第13张  View Code

四、静态文件

对于静态文件,可以配置静态文件的目录和前段使用时的前缀,并且Tornaodo还支持静态文件缓存。

Python开发【第十五篇】:Web框架之Tornado 随笔 第14张  app.py Python开发【第十五篇】:Web框架之Tornado 随笔 第15张  index.html

注:静态文件缓存的实现

Python开发【第十五篇】:Web框架之Tornado 随笔 第16张  View Code

五、cookie

Tornado中可以对cookie进行操作,并且还可以对cookie进行签名以放置伪造。

1、基本操作

Python开发【第十五篇】:Web框架之Tornado 随笔 第17张  View Code

2、加密cookie(签名)

Cookie 很容易被恶意的客户端伪造。加入你想在 cookie 中保存当前登陆用户的 id 之类的信息,你需要对 cookie 作签名以防止伪造。Tornado 通过 set_secure_cookie 和 get_secure_cookie 方法直接支持了这种功能。 要使用这些方法,你需要在创建应用时提供一个密钥,名字为 cookie_secret。 你可以把它作为一个关键词参数传入应用的设置中:

Python开发【第十五篇】:Web框架之Tornado 随笔 第18张  View Code Python开发【第十五篇】:Web框架之Tornado 随笔 第19张  内部算法

签名Cookie的本质是:

写cookie过程:

  • 将值进行base64加密
  • 对除值以外的内容进行签名,哈希算法(无法逆向解析)
  • 拼接 签名 + 加密值

读cookie过程:

  • 读取 签名 + 加密值
  • 对签名进行验证
  • base64解密,获取值内容

注:许多API验证机制和安全cookie的实现机制相同。

Python开发【第十五篇】:Web框架之Tornado 随笔 第20张  基于Cookie实现用户验证-Demo Python开发【第十五篇】:Web框架之Tornado 随笔 第21张  基于签名Cookie实现用户验证-Demo

3、JavaScript操作Cookie

由于Cookie保存在浏览器端,所以在浏览器端也可以使用JavaScript来操作Cookie。

1 2 3 4 5 6 7 8 9 /* 设置cookie,指定秒数过期   */ function  setCookie(name,value,expires){      var  temp = [];      var  current_date =  new  Date();      current_date.setSeconds(current_date.getSeconds() + 5);      document.cookie = name +  "= " + value + ";expires="  + current_date.toUTCString(); }

对于参数:

  • domain   指定域名下的cookie
  • path       域名下指定url中的cookie
  • secure    https使用

注:jQuery中也有指定的插件 jQuery Cookie 专门用于操作cookie,猛击这里

六、CSRF

Tornado中的夸张请求伪造和Django中的相似,跨站伪造请求(Cross-site request forgery)

Python开发【第十五篇】:Web框架之Tornado 随笔 第22张  配置 Python开发【第十五篇】:Web框架之Tornado 随笔 第23张  使用 - 普通表单 Python开发【第十五篇】:Web框架之Tornado 随笔 第24张  使用 - AJAX

注:Ajax使用时,本质上就是去获取本地的cookie,携带cookie再来发送请求

七、上传文件

1、Form表单上传

Python开发【第十五篇】:Web框架之Tornado 随笔 第25张  HTML Python开发【第十五篇】:Web框架之Tornado 随笔 第26张  Python

2、AJAX上传

Python开发【第十五篇】:Web框架之Tornado 随笔 第27张  HTML - XMLHttpRequest Python开发【第十五篇】:Web框架之Tornado 随笔 第28张  HTML - jQuery Python开发【第十五篇】:Web框架之Tornado 随笔 第29张  HTML - iframe Python开发【第十五篇】:Web框架之Tornado 随笔 第30张  Python Python开发【第十五篇】:Web框架之Tornado 随笔 第31张  扩展:基于iframe实现Ajax上传示例 Python开发【第十五篇】:Web框架之Tornado 随笔 第32张  View Code Python开发【第十五篇】:Web框架之Tornado 随笔 第33张  其他

 

八、验证码

验证码原理在于后台自动创建一张带有随机内容的图片,然后将内容通过img标签输出到页面。

安装图像处理模块:

1 pip3 install pillow

示例截图:

Python开发【第十五篇】:Web框架之Tornado 随笔 第34张

验证码Demo源码下载:猛击这里

九、异步非阻塞

1、基本使用

装饰器 + Future 从而实现Tornado的异步非阻塞

1 2 3 4 5 6 7 8 9 10 11 12 13 14 class  AsyncHandler(tornado.web.RequestHandler):        @gen .coroutine      def  get( self ):          future  =  Future()          future.add_done_callback( self .doing)          yield  future          # 或          # tornado.ioloop.IOLoop.current().add_future(future,self.doing)          # yield future        def  doing( self , * args,  * * kwargs):          self .write( 'async' )          self .finish()

当发送GET请求时,由于方法被@gen.coroutine装饰且yield 一个 Future对象,那么Tornado会等待,等待用户向future对象中放置数据或者发送信号,如果获取到数据或信号之后,就开始执行doing方法。

异步非阻塞体现在当在Tornaod等待用户向future对象中放置数据时,还可以处理其他请求。

注意:在等待用户向future对象中放置数据或信号时,此连接是不断开的。

2、同步阻塞和异步非阻塞对比

Python开发【第十五篇】:Web框架之Tornado 随笔 第35张  同步阻塞 Python开发【第十五篇】:Web框架之Tornado 随笔 第36张  异步非阻塞

3、httpclient类库

Tornado提供了httpclient类库用于发送Http请求,其配合Tornado的异步非阻塞使用。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 #!/usr/bin/env python # -*- coding:utf-8 -*-     import  tornado.web from  tornado  import  gen from  tornado  import  httpclient   # 方式一: class  AsyncHandler(tornado.web.RequestHandler):      @gen .coroutine      def  get( self * args,  * * kwargs):          print ( '进入' )          http  =  httpclient.AsyncHTTPClient()          data  =  yield  http.fetch( "http://www.google.com" )          print ( '完事' ,data)          self .finish( '6666' )   # 方式二: # class AsyncHandler(tornado.web.RequestHandler): #     @gen.coroutine #     def get(self): #         print('进入') #         http = httpclient.AsyncHTTPClient() #         yield http.fetch("http://www.google.com", self.done) # #     def done(self, response): #         print('完事') #         self.finish('666')       application  =  tornado.web.Application([      (r "/async" , AsyncHandler), ])   if  __name__  = =  "__main__" :      application.listen( 8888 )      tornado.ioloop.IOLoop.instance().start() 
Python开发【第十五篇】:Web框架之Tornado 随笔 第37张  基于异步非阻塞和Tornado-MySQL实现用户登录示例

自定义Web组件

一、Session

1、面向对象基础

面向对象中通过索引的方式访问对象,需要内部实现 __getitem__ 、__delitem__、__setitem__方法

+ View Code

2、Tornado扩展

Tornado框架中,默认执行Handler的get/post等方法之前默认会执行 initialize方法,所以可以通过自定义的方式使得所有请求在处理前执行操作...

+ View Code

3、session

session其实就是定义在服务器端用于保存用户回话的容器,其必须依赖cookie才能实现。

Python开发【第十五篇】:Web框架之Tornado 随笔 第38张  自定义Session

4、分布式Session

Python开发【第十五篇】:Web框架之Tornado 随笔 第39张  一致性哈西 Python开发【第十五篇】:Web框架之Tornado 随笔 第40张  session

二、表单验证

在Web程序中往往包含大量的表单验证的工作,如:判断输入是否为空,是否符合规则。

Python开发【第十五篇】:Web框架之Tornado 随笔 第41张  HTML Python开发【第十五篇】:Web框架之Tornado 随笔 第42张  Python

由于验证规则可以代码重用,所以可以如此定义:

Python开发【第十五篇】:Web框架之Tornado 随笔 第43张  View Code
扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄