一、安装tornado
手动安装: 下载 tornado-1.2.1.tar.gz
tar xvzf tornado-1.2.1.tar.gz
cd tornado-1.2.1
python setup.py build
sudo python setup.py install
安装要求:需要先安装:python2.7
Mac OS X 10.6 (Python 2.6+) sudo easy_install setuptools pycurl
Ubuntu Linux (Python 2.6+) sudo apt-get install python-pycurl
Ubuntu Linux (Python 2.5) sudo apt-get install python-dev python-pycurl python-simplejson
安装过程:
下载:tornado-1.2.1.tar.gz,解后解压
开始安装:
#先检查是否是python2.7
C:\tornado-1.2.1>python
Python 2.7.13 (v2.7.13:a06454b1afa1, Dec 17 2016, 20:53:40) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> exit() #开始安装
C:\tornado-1.2.1>python setup.py build C:\tornado-1.2.1>python setup.py install
二、介绍tornado
Tornado:
1. 版本 4.4
要求:1.2.1
环境:Python2.7 2. 源码分析流程:
a. python app.py
- 加载路由关系
- 加载配置文件
- 启动socket 作业:
经历的类
创建对象后,对象中大概封装了
类中的方法的执行流程 b. 用户发请
- 匹配路由
- 执行指定类的方法 c. 异步非阻塞
三、简单介绍tornado的使用
示例:
代码:
app.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import tornado.ioloop
import tornado.web
class MainHandler(tornado.web.RequestHandler):
def get(self):
self.write("Hello, world") class LoginHandler(tornado.web.RequestHandler):
def get(self):
# self.write("请登录")
self.render("login.html") def post(self, *args, **kwargs):
v = self.get_argument('username')
print(v)
self.redirect('/index.html') settings = {
'template_path': 'templates',
'static_path': 'static',
'static_url_prefix': '/ppp/',
} # application对象中封装了:路由信息,配置信息
application = tornado.web.Application([
(r"/login.html", LoginHandler),
(r"/index.html", MainHandler),
],**settings) # application.add_handlers('buy.oldboy.com',[
# (r"/login.html", LoginHandler),
# (r"/index.html", MainHandler),
# ]) if __name__ == "__main__":
# 创建socket对象
# sock = socket.socket()
# inputs = [socket,]
application.listen(8888) # 开启 r,w,e = select.select(inputs,)
tornado.ioloop.IOLoop.instance().start()
login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>登录</h1>
<form action="/login.html" method="POST">
<input type="text" name="username" placeholder="用户名" />
<input type="submit" value="提交" />
</form>
<img src="/ppp/1.png">
</body>
</html>
用运行Python程序的方法运行,注意监听的端口。
运行结果:
四、tornado源码之待请求阶段
上图是tornado程序启动以及接收到客户端请求后的整个过程,对于整个过程可以分为两大部分:
- 启动程序阶段,又称为待请求阶段(上图1、2所有系列和3.0)
- 接收并处理客户端请求阶段(上图3系列)
简而言之:
1、在启动程序阶段,第一步,获取配置文件然后生成url映射(即:一个url对应一个XXRequestHandler,从而让XXRequestHandler来处理指定url发送的请求);第二步,创建服务器socket对象并添加到epoll中;第三步,创建无线循环去监听epoll。
2、在接收并处理请求阶段,第一步,接收客户端socket发送的请求(socket.accept);第二步,从请求中获取请求头信息,再然后根据请求头中的请求url去匹配某个XXRequestHandler;第三步,匹配成功的XXRequestHandler处理请求;第四步,将处理后的请求发送给客户端;第五步,关闭客户端socket。
本篇的内容主要剖析【启动程序阶段】,下面我们就来一步一步的剖析整个过程,在此阶段主要是有下面重点标注的三个方法来实现。