tornado学习笔记19 Tornado框架分析
19.1 Http服务器请求处理流程图

(1) 调用HTTPServer的bind方法,绑定Socket的监听端口号;
(2) 调用HTTPServer的listen方法,初始化一个listen socket对象;
(3) 调用add_hander方法,将初始化的listen socket对象添加至IOLoop池中,这时的socket就开始监听来自客户端的请求。
(4) 客户端发送HTTP请求;
(5) listen socket监听到客户端的请求,调用listen socket的accept方法,表示开始接收请求;同时重新生成一个新的socket,为了区分,叫做client socket。
(6) IOLoop回调HTTPServer的 handle_stream方法;
(7) handle_stream初始化HTTP1ServerConnection对象,并将其添加至池中;
(8) 调用HTTP1ServerConnection的start_serve方法,开始处理请求,初始化IOStream、HTTP1Connection对象,同时初始化_RequestDispater请求分发器。
(9) _RequestDispater请求分发器初始化HttpServerRequest对象,请根据Application配置的映射设置hanlder_class以及handler_kwargs等属性。
(10) HTTP1Connection读取请求的信息,比如请求头,请求体等信息。
(11) 解析读取的请求头、请求体数据块信息,供自定义的RequestHandler调用。
(12) 调用自定义的RequestHandler的相关的方法,比如get、post。
(13) 将处理的结果(一般为RequestHandler的render方法返回)返回给HTTP1Connection;
(14) HTTP1Connection将Response写入到IOStream流中;
(15) client socket将流返回给客户端。
19.2 类关系图

其中:
HTTPServerConnectionDelegate、HTTPMessageDelegate为接口。IOStream、IOLoop、Application、HTTPServer、RequestHandler、HTTPServerRequest是Tornado中比较重要的模块。但是,应用程序开发者一般只针对Application、RequestHandler进行自定义设置与开发,特别是RequestHandler。一个典型的torando应用网站由Application、HTTPServer、以及一序列的RequestHandler组成。
19.3 RequestHandler的处理流程

(1) 首先进行初始化RequestHandler对象;
(2) 调用自定义的initialize方法,进行相关的初始化操作,比如数据库连接、各种变量的初始化等等;
(3) 根据Http请求的类型,判断是否支持该类请求,RequestHandler默认支持的方法包括GET、POST、HEAD、DELETE、PATCH、PUT、OPTIONS;
(4) 如果支持,则调用prepare方法。如果不支持,则结束该流程;
(5) 判断prepare方法是否对finished属性设置为True,如果是,则结束该流程,如果没有,则转入下一步。
(6) 调用相应的方法,比如get、post;
(7) 调用write或者render方法;
(8) 判断finished属性设置为True,如果是,则结束该流程,如果没有,则转入下一步。
(9) 调用finish方法,将数据写入返回流中。
(10) 最后调用on_finish方法,释放相关的资源或变量。
tornado学习笔记19 Tornado框架分析的更多相关文章
- Tornado学习笔记12 tornado.httpserver-.非阻塞的Http服务器
是一个非阻塞的,单线程的Http 服务器. 一般地,应用程序很少与HttpServer类直接交互,除非在进程开始时启动服务时(甚至在使用tornado.web.Applicaiton.listen时也 ...
- tornado 学习笔记9 Tornado web 框架---模板(template)功能分析
Tornado模板系统是将模板编译成Python代码. 最基本的使用方式: t = template.Template("<html>{{ myv ...
- Hadoop学习笔记—19.Flume框架学习
START:Flume是Cloudera提供的一个高可用的.高可靠的开源分布式海量日志收集系统,日志数据可以经过Flume流向需要存储终端目的地.这里的日志是一个统称,泛指文件.操作记录等许多数据. ...
- Tornado学习笔记(一) helloword/多进程/启动参数
前言 当你觉得你过得很舒服的时候,你肯定没有在进步.所以我想学习新的东西,然后选择了Tornado.因为我觉得Tornado更匹配目前的我的综合素质. Tornado学习笔记系列主要参考<int ...
- tornado 学习笔记1 引言
从事软件开发这行业也快5年啦,其实从事的工作也不完全是软件开发,软件开发只是我工作中的一部分.其中包括课题研究.信息化方案设计.软件开发.信息系统监理.项目管理等工作,比较杂乱.开发的软件比较多,但是 ...
- Ext.Net学习笔记19:Ext.Net FormPanel 简单用法
Ext.Net学习笔记19:Ext.Net FormPanel 简单用法 FormPanel是一个常用的控件,Ext.Net中的FormPanel控件同样具有非常丰富的功能,在接下来的笔记中我们将一起 ...
- SQL反模式学习笔记19 使用*号,隐式的列
目标:减少输入 反模式:捷径会让你迷失方向 使用通配符和未命名的列能够达到减少输入的目的,但是这个习惯会带来一些危害. 1.破坏代码重构:增加一列后,使用隐式的Insert插入语句报错: 2.查询中使 ...
- golang学习笔记19 用Golang实现以太坊代币转账
golang学习笔记19 用Golang实现以太坊代币转账 在以太坊区块链中,我们称代币为Token,是以太坊区块链中每个人都可以任意发行的数字资产.并且它必须是遵循erc20标准的,至于erc20标 ...
- go语言,golang学习笔记2 web框架选择
go语言,golang学习笔记2 web框架选择 用什么go web框架比较好呢?能不能推荐个中文资料多的web框架呢? beego框架用的人最多,中文资料最多 首页 - beego: 简约 & ...
随机推荐
- MySQL 查询所有子级函数
BEGIN DECLARE sChildList VARCHAR(4000); DECLARE sChildTemp VARCHAR(4000); SET sChildTemp =cast(rootI ...
- TJpgDec—轻量级JPEG解码器
TJpgDec-轻量级JPEG解码器 本文由乌合之众lym瞎编,欢迎转载blog.cnblogs.net/oloroso 下文中解码一词皆由decompression/decompress翻译而来. ...
- offsetParent的解释
offsetParent是个只读属性,返回最近显示指定位置的容器元素的父级.如果元素没有指定位置,最近的元素或者根元素(标准模式下是html,怪异模式下是body)就是offsetParent off ...
- RSA非对称性前端加密后端解密
前端加密代码 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> ...
- JS Date.parse() 函数详解
Date.parse()函数用于分析一个包含日期的字符串,并返回该日期与 1970 年 1 月 1 日午夜之间相差的毫秒数. 该函数属于Date对象,所有主流浏览器均支持该函数. 语法 Date.pa ...
- Android安全相关文章[不定期更新…]
http://drops.wooyun.org/papers/2893 Intent scheme URL attack http://drops.wooyun.org/tips/3812 Andro ...
- struts2笔记(2)
<context-param> <param-name>pattern</param-name> <param-value>yyyy-MM-dd hh: ...
- 将数据导入Excel
/** * 查询未打印订单 * @param req * @param sort * @param order * @param rows * @param page * @return */ pub ...
- select样式美化(简单实用)
美化select,可以实用一个a标签将select嵌套进去,然后将<a>相对定位,在将select绝对定位,美化<a>即可 文件下载链接:https://i.cnblogs.c ...
- 素数的平方阶群必为Abel群
定理 设$p$为素数,则$p^2$阶群$G$必为Abel群.