Tornado
Tornado 是基于 Python 实现的异步网络框架,它采用非阻塞IO,可以支持成千上万的并发访问量,所以非常适合于长轮询和 Websocket,以及其他需要持久连接的应用场景,因此 Tornado 是实时 Web 服务的一个理想框架。
tornado vs Django
Django:重量级web框架,功能大而全,注重高效开发
内置管理后台
内置封装完善的ORM操作
session功能
后台管理
缺陷:高耦合
Tornado:轻量级web框架,功能少而精,注重性能优越
HTTP服务器
异步编程
WebSocket
缺陷:入门门槛较高
hello world
使用tornado需要先安装扩展,我这里用的是py2.7
用pycharm IDE 写 demo 时直接安装,或者用pip。pip install tornado
我也是刚开始学,所以在网上找了一个demo,其中每行代码都标有注释。
#-*- coding:utf-8 -*-
import tornado.web
import tornado.ioloop
#定义处理类型
class IndexHandler(tornado.web.RequestHandler):
#添加一个处理get请求方式的方法
def get(self):
#向响应中,添加数据
self.write('<h1>hello tornado</h1>')
if __name__ == '__main__':
#创建一个应用对象
app = tornado.web.Application([(r'/',IndexHandler)])
#绑定一个监听端口
app.listen(8888)
#启动web程序,开始监听端口的连接
tornado.ioloop.IOLoop.current().start()
main代码块里,前两段代码比较好理解。
1.从list取出路径和对应的handler去创建一个Application对象
2.监听指定的端口(HTTPServer > socket)
tornado.ioloop.IOLoop.current().start()
最后一个对于python初学者来说就比较难理解。
所以这句代码先不做解释,通过网上的资料查阅能知道,这里面主要的操作就是去实现一个单例的ioloop,让他从头到尾只有一个实例。
再看IndexHandler类,它继承了tornado.web.RequestHandler
RequestHandler中定义了很多方法。
在这个demo里,它重写了父类的get方法,意思是以GET请求访问“/”这个路径的时候,去执行父类里的write方法。
RequestHandler
这里我列出一些里面常见的方法并作出解释。
get_argument # 获取参数
get_arguments # 获取多个参数
get_query_argument # 获取参数
get_query_arguments # 获取多个参数
get_body_argument # 获取请求体参数
get_body_arguments # 获取多个请求体参数
get_cookie # 获取cookie
get_status # 响应状态
add_header # 添加响应头
set_header # 设置响应头
set_status # 设置响应码
xsrf_form_html # 使用csrf防御功能
write # 输出buffer
redirect # 跳转
URL:http://localhost:8888/?a=1&b=2&b=2&e=5
POST:c=3&d=4&d=4
最后写一个 登录的demo
Server.py
#!/usr/bin/env python
# coding=utf-8
import tornado
import Application
if __name__ == '__main__':
app = Application.app
app.listen(8883)
tornado.ioloop.IOLoop.current().start()
Application.py
#!/usr/bin/env python
# coding=utf-8
import tornado.web
import os
from handle import IndexHandle, LoginHandle
settings = dict(
template_path = os.path.join(os.path.dirname(__file__), "template"),
debug = True,
)
path = [
(r'/',IndexHandle.IndexHandle),
(r'/login', LoginHandle.LoginHanler),
]
app = tornado.web.Application(handlers= path , **settings)
LoginHanler类
from BaseHandle import BaseHandle
class LoginHanler (BaseHandle):
def get(self):
self.render("login.html")
pass
def post(self):
user = self.get_body_argument("username")
pwd = self.get_body_argument("password")
if cmp(user , "admin")==0 and cmp(pwd , "123456")==0:
self.set_cookie("user",user)
self.redirect("/")
else:
self.write("<script>alert('auth error');history.go(-1);</script>")
pass
IndexHanlde类
#!/usr/bin/env python
# coding=utf-8
import tornado.web
from handle.BaseHandle import BaseHandle
class IndexHandle(BaseHandle):
def get(self):
print 1
if self.getuser() == None:
self.redirect("/login")
else:
return self.render("index.html", user = self.getuser())
BaseHandle类
#!/usr/bin/env python
# coding=utf-8
import tornado.web
class BaseHandle(tornado.web.RequestHandler):
def getuser(self):
user = self.get_cookie("user")
if user!=None:
return user
return None
template/index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>hello,{{user}}</h1>
</body>
</html>
template/login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<center>
<form method="post">
<input type="text" name="username" placeholder="用户名"> <br/>
<input type="password" name="password" placeholder="密码"><br/>
<input type="submit" value="登陆"><br/>
</form>
</center>
</body>
</html>