1.Tornado简介
Tornado是基于epoll的非阻塞式WEB框架,是一个轻量级的Web服务的开源软件
1.1特点
Tornado拥有异步非阻塞IO处理方式,其出色的负载能力,官方用nginx反向代理的方式部署的Tornado比其他框架更能抗压
1.2使用场景
可以用于开发用户量大,高并发,大量HTTP持久链接的WEB网站
1.3性能
Tornado在设计之初就考虑到了性能因素,旨在解决C10K问题,这样的设计使其成为一个拥有非常高性能的解决方案
2.Tornado的机制
   
Tornado机制:
1.先创建parse_command_line()函数,产生了一个app的对象
2.启动的HttpServer的服务器,把app放进HttpServer中
3.listen监听端口
4.ioloop.IoLoop.currentc创建Socket服务,把socket服务放到epoll里面
5.ioloop.IoLoop.current.start()启动服务,不断的访问epoll
6.前端发送请求
7.epoll监听的端口告诉socket,
8.新建立一个socket
9.然后socket访问(路由映射列表),进行解包,
10.把数据返回给浏览器
epoll和kqueue的区别如下:
kevent与epoll最大的不同在于READ/WRITE事件是分开注册并且分开返回的,而Epoll则是一个fd一次返回读和写事件,用标志位来判断。
详情:https://www.cnblogs.com/linganxiong/p/5583415.html
3.Tornado使用
3.1常用方法
import tornado.web   
import tornado.ioloop
import json
class IndexHandler(tornado.web.RequestHandler):
    def set_default_headers(self):
          #返回前端的请求头
            self.set_header("Content-Type","application/json")
  #get请求
    def get(self):
        # 输出在网页上
        self.write("ok")     # 获取路由上的值,例如:http://127.0.0.1:8001/?subject=谢城     subject=self.get_query_argument('subject')     # 获取url上多个值,例如:?q=1&q=2&q=3      query_args=self.get_query_arguments("q")     # 获取url上最后一个值     query_arg=self.get_query_argument("q") #返回unicode字符串      #获取url上最后一个值      body=self.get_argument("a")      # 返回字符串类型的列表类型      # strip=False可以让url的元素可以携带空格      bodys=self.get_arguments("a",strip=False)      print(self.request.files)      ##重定向 self.redirect() 重定向跳转到其他页面,比如self.redirect("/write")跳转到http://127.0.0.1:9000/wtite      ##接收错误,并处理。所以说上面这两个必须连用。 self.write_error(status_code,**kwargs) 接收返回来的错误并处理错误      ##抛出HTTP错误状态码,默认为500, tornado会调用write_error()方法并处理 self.send_error(status_code=500,**kwargs) 抛出错误       self.files:用户上传的文件,字典类型           ##设置状态码         self.set_status(status_code,reason=None)          作用:为响应设置状态码            self.set_status(404,"bad boy")          参数:status_code (状态码的值,int类型)                    如果reason=None,则状态码必须为正常值,列如999            reason (描述状态码的词组,sting字符串类型)
if __name__ == '__main__':
    # 创建一个app对象   #Application:他是tornado.web的核心应用类,是与服务器对应的一个接口,里面保存了路由映射表   # 还有一个listen方法,可以认为用来创建一个http的实例,并绑定端口
    app=tornado.web.Application(
       [
       #设置Url
      (r'/',IndexHandler)
    ])
    # 绑定一个监听接口
    app.listen(8000)
    # 启动web程序
    tornado.ioloop.IOLoop.current().start() 
 启动127.0.0.1:8000
       
3.2reuqust对象
  1.request对象作用:
  储存了关于请求的相关信息
  2.属性:
  method:HTTP请求的方式
  host:被请求的主机名
  uri:请求的完整资源地址,包括路径和get查询参数部分
  path:请求的路径部分
  query:请求参数部分
  version:使用的HTTP版本
  headers:请求的协议头,字典类型
  body:请求体数据
  remote_ip:客户端的ip
  files:用户上传的文件,字典类型
3.3前后端交互
import json
import os
import tornado.web
import tornado.ioloop
import tornado.options
import tornado.httpserver
from tornado.web import RequestHandler,url,StaticFileHandler
from tornado.options import define,options
import tornado.ioloop
# 定义了服务器监听的默认端口
# define("post",default=8000,type=int)
# torando支持传输自定义函数
def title_join(number):
    return "_".join(number)
class IndexHandler(RequestHandler):
    def get(self):
        # 跳转模板
        # self.render("head.html",n=100,b=200)
        dic=[{"name":"谢城","age":18,"gender":"男"},{"name":"杨美","age":24,"gender":"女"}]
        self.render("exd.html",dic=dic,func=title_join)
class ItcastHandler(RequestHandler):
    def get(self):
        self.write('<h2>baidu</h2>')
if __name__ == '__main__':
    tornado.options.parse_command_line()
    # 项目目录
    current_path=os.path.dirname(__file__)
    # 配置模板
    settings=dict(
        # 配置静态资源
        static_path=os.path.join(current_path, "static"),
        # 配置模板
        template_path=os.path.join(current_path, "template"),
        # 配置token
        xsrf_cookies=True,
    )
    # url
    app=tornado.web.Application([
        (r"/",IndexHandler),
        # 配置url
        # (r'/itcast', ItcastHandler),
        # 配置静态页面
        (r'/(.*)', StaticFileHandler, {"path": os.path.join(current_path, "static"), "default_filename": 'red.html'}),
    ],
        **settings)
    http_server=tornado.httpserver.HTTPServer(app)
    http_server.listen(8886)
    tornado.ioloop.IOLoop.current().start()
3.4Tornado模板语言
<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title>Title</title>
</head>
<body>
<h1>天下第一</h1>
{%if len(dic)>0%}
{%for i in dic%}
<h4>{{i["name"]}}</h4>
<h4>{{i["age"]}}</h4>
<h4>{{i["gender"]}}</h4>
{{func(i["name"])}}
{%end%}
{%else%}
没有数据
{%end%}
{% block  js%} {% end %}
</body>
</html>
4.Torando异步
因为epollz主要是用来解决网络IO的并发问题,所以Tornado的异步编程主要体现再网络IO的异步上,即异步Web请求
4.1tornado.httpclient.AsyncHTTPClient
Tornado提供了一个异步Web请求客户端1tornado.httpclient.AsyncHTTPClient用来进行异步Web请求
fetch(request,callback=None)
用于执行一个web请求request,并异步返回一个tornado.httpclient.HTTPResponse响应
request可以是一个url,也可以是一个tornado.httpclient.HTTPRequest对象,如果是Url,fetch会自己构造一个HttpRequest对象
4.2回调异步
未完待续