第一天(hello tornado)
环境
习惯用python2,所以安装6.0以下版本的tornado(6.0以上最低3.5)
pip install tornado==5.1.1
demo跑起来
执行python ./test1.py
测试一下
curl是基于URL语法在命令行方式下工作的文件传输工具,它支持FTP,FTPS,HTTP,HTTPS,GOPHER,TELNET,DICT,FILE及LDAP等协议。curl支持HTTPS认证,并且支持HTTP的POST,PUT等方法,FTP上传,kerberos认证,HTTP上传,代理服务器,cookies,用户名/密码认证,通过http代理服务器上传文件到FTP服务器等等,功能十分强大。
- -A/–user-agent 设置用户代理发送给服务器,即告诉服务器浏览器为什么
- -basic 使用HTTP基本验证
- –tcp-nodelay 使用TCP_NODELAY选项
- -e/–referer 来源网址,跳转过来的网址
- –cacert 指定CA证书 (SSL)
- –compressed 要求返回是压缩的形势,如果文件本身为一个压缩文件,则可以下载至本地
- -H/–header
自定义头信息传递给服务器 - -I/–head 只显示响应报文首部信息
- –limit-rate 设置传输速度
- -u/–user <user[:password]>设置服务器的用户和密码
- -0/–http1.0 使用HTTP 1.0
curl -X PUT www.baidu.com
curl -X DELETE www.baidu.com
curl -X POST www.baidu.com -d “key=value&key1=value1”
curl -X GET www.baidu.com
-X 指定请求方式 -d 添加参数
curl localhost:8000/
Hello, Welcome to the world of tornado!
curl -X POST localhost:8000/
My name is tornado !
关于代码
上述的一个简单web服务主要包含了两个模块
-
tornado.web 这是一个tornado中的web模块
- RequestHandler
不同于django,tornado将request与response都封装在了requesthandler中,它封装了对应一个请求的所有信息和方法,write方法是写入响应信息;对于请求方式不同,将不同的逻辑写入到与方法同名的成员方法中,当未重写同名的成员方法时,将会返回 405 方法不被准许错误。 - Application
它是tornado web框架的核心应用类,是与服务器对接的接口,保存有路由信息表,其初始化接收的第一个参数就是一个路由信息映射元组的列表;其listen(端口)方法用来创建一个http服务器实例,并绑定到给定端口(注意:此时服务器并未开启监听)。
- RequestHandler
-
tornado.ioloop tornado的核心io循环模块
它封装了Linux的epoll和BSD的kqueue,tornado高性能的基石。
- IOLoop.current() 返回当前线程的IOLoop实例。
- IOLoop.start() 启动IOLoop实例的I/O循环,同时服务器监听被打开。
-
tornado.options 从命令行中读取设置
它的用法如下:
from tornado.options import define, options
define("port", default=8000, help="run on the given port", type=int)
.
.
.
tornado.options.parse_command_line()
.
http_server.listen(options.port)
.
如果一 个与 define 语句中同名的设置在命令行中被给出,那么它将成为全局 options 的一个 属性。如果用户运行程序时使用了–help 选项,程序将打印出所有你定义的选项以及 你在 define 函数的 help 参数中指定的文本。如果用户没有为这个选项指定值,则使 用default的值进行代替。Tornado使用type参数进行基本的参数类型验证,当不合
适的类型被给出时抛出一个异常。因此,我们允许一个整数的 port 参数作为 options.port 来访问程序。如果用户没有指定值,则默认为 8000。
总结
1 创建请求处理类,继承handler类,重写相应方法
2 创建web应用实例对象,定义路由映射列表
3 绑定端口
4 开启监听服务
Tornado——第二天(关于端口绑定)
回顾
在创建完一个基础的web应用后,我们使用 app.listen() 方法来将 web服务与端口绑定。
这个地方的listen() 方法只是一个封装后的简写形式。
这个绑定过程的原始形式如下:
# app.listen(8000)
http_server = tornado.httpserver.HTTPServer(app)
http_server.listen(8000)
首先使用了tornado中的http模块为 app 创建了一个 http服务实例。然后将这个服务与8000端口绑定
开启多进程
我们上述都是为tornado开启了一个进程,如果想开启多个线程的话,需要做以下操作:
http_server = tornado.httpserver.HTTPServer(app)
http_server.bind(8000)
http_server.start(0)
http_server.start(num_processes=1)方法指定开启几个进程,参数num_processes默认值为1,即默认仅开启一个进程;如果num_processes为None或者<=0,则自动根据机器硬件的cpu核芯数创建同等数目的子进程;如果num_processes>0,则创建num_processes个子进程。
而以前使用的简写形式与listen形式则相当于
http_server.bind(8000)
http_server.start(1)
关于多进程形式,因为子进程是从父进程中复制的ioloop实例,所以在创建子进程前如果更改了父进程的ioloop实例,那么每一个子进程都将受影响。
Tornado——第三天(参数传递)
tornado获取参数大致有三种形式:
- 路由表中正则获取
# _*_ coding:utf-8 _*_
import tornado.web
import tornado.ioloop
import tornado.httpserver
from tornado.options import define,options
# 定义初始端口(默认8000)
define("port", default=8000,help="run on the given port", type=int)
class IndexHandler(tornado.web.RequestHandler):
def get(self,params1):
self.write("i get a params: %s"%params1)
if __name__ == "__main__":
tornado.options.parse_command_line()
app = tornado.web.Application(
handlers=[
(r"/(\w*)", IndexHandler),
]
)
http_server = tornado.httpserver.HTTPServer(app)
http_server.listen(options.port)
tornado.ioloop.IOLoop.current().start()
- 通过内置方法获取
# _*_ coding:utf-8 _*_
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
class