Tornado 是 FriendFeed 使用的可扩展的非阻塞式 web 服务器及其相关工具的开源版本。这个 Web 框架看起来有些像web.py 或者 Google 的 webapp,不过为了能有效利用非阻塞式服务器环境,这个 Web 框架还包含了一些相关的有用工具 和优化。javascript
Tornado 和如今的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,并且速度至关快。得利于其 非阻塞的方式和对 epoll 的运用,Tornado 每秒能够处理数以千计的链接,这意味着对于实时 Web 服务来讲,Tornado 是一个理想的 Web 框架。咱们开发这个 Web 服务器的主要目的就是为了处理 FriendFeed 的实时功能 ——在 FriendFeed 的应用里每个活动用户都会保持着一个服务器链接。(关于如何扩容 服务器,以处理数以千计的客户端的链接的问题,请参阅 C10K problem。)html
下载安装:java
1
2
3
4
|
pip3 install tornado
源码安装
https:
/
/
pypi.python.org
/
packages
/
source
/
t
/
tornado
/
tornado
-
4.3
.tar.gz
|
1、快速上手python
执行过程:jquery
2、路由系统git
路由系统其实就是 url 和 类 的对应关系,这里不一样于其余框架,其余不少框架均是 url 对应 函数,Tornado中每一个url对应的是一个类。github
Tornado中原生支持二级域名的路由,如:web
3、模板引擎算法
Tornao中的模板语言和django中相似,模板引擎将模板文件载入内存,而后将数据嵌入其中,最终获取到一个完整的字符串,再将字符串返回给请求者。django
Tornado 的模板支持“控制语句”和“表达语句”,控制语句是使用 {%
和 %}
包起来的 例如 {% if len(items) > 2 %}
。表达语句是使用 {{
和 }}
包起来的,例如 {{ items[0] }}
。
控制语句和对应的 Python 语句的格式基本彻底相同。咱们支持 if
、for
、while
和 try
,这些语句逻辑结束的位置须要用 {% end %}
作标记。还经过 extends
和 block
语句实现了模板继承。这些在 template
模块 的代码文档中有着详细的描述。
注:在使用模板前须要在setting中设置模板路径:"template_path" : "tpl"
一、基本使用
二、母版
三、导入
四、自定义UIMethod以UIModule
a. 定义
b. 注册
c. 使用
4、静态文件
对于静态文件,能够配置静态文件的目录和前段使用时的前缀,而且Tornaodo还支持静态文件缓存。
注:静态文件缓存的实现
5、cookie
Tornado中能够对cookie进行操做,而且还能够对cookie进行签名以放置伪造。
一、基本操做
二、加密cookie(签名)
Cookie 很容易被恶意的客户端伪造。加入你想在 cookie 中保存当前登录用户的 id 之类的信息,你须要对 cookie 做签名以防止伪造。Tornado 经过 set_secure_cookie 和 get_secure_cookie 方法直接支持了这种功能。 要使用这些方法,你须要在建立应用时提供一个密钥,名字为 cookie_secret。 你能够把它做为一个关键词参数传入应用的设置中:
签名Cookie的本质是:
写cookie过程:
- 将值进行base64加密
- 对除值之外的内容进行签名,哈希算法(没法逆向解析)
- 拼接 签名 + 加密值
读cookie过程:
- 读取 签名 + 加密值
- 对签名进行验证
- base64解密,获取值内容
注:许多API验证机制和安全cookie的实现机制相同。
三、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();
}
|
对于参数:
注:jQuery中也有指定的插件 jQuery Cookie 专门用于操做cookie,猛击这里
6、CSRF
Tornado中的夸张请求伪造和Django中的类似,跨站伪造请求(Cross-site request forgery)
注:Ajax使用时,本质上就是去获取本地的cookie,携带cookie再来发送请求
7、上传文件
一、Form表单上传
二、AJAX上传
8、验证码
验证码原理在于后台自动建立一张带有随机内容的图片,而后将内容经过img标签输出到页面。
安装图像处理模块:
1
|
pip3 install pillow
|
示例截图:
验证码Demo源码下载:猛击这里
9、异步非阻塞
一、基本使用
装饰器 + 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对象中放置数据或信号时,此链接是不断开的。
二、同步阻塞和异步非阻塞对比
三、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()
|
1、Session
一、面向对象基础
面向对象中经过索引的方式访问对象,须要内部实现 __getitem__ 、__delitem__、__setitem__方法
二、Tornado扩展
Tornado框架中,默认执行Handler的get/post等方法以前默认会执行 initialize方法,因此能够经过自定义的方式使得全部请求在处理前执行操做...
三、session
session其实就是定义在服务器端用于保存用户回话的容器,其必须依赖cookie才能实现。
四、分布式Session
2、表单验证
在Web程序中每每包含大量的表单验证的工做,如:判断输入是否为空,是否符合规则。
因为验证规则能够代码重用,因此能够如此定义: