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方法,释放相关的资源或变量。

时间: 2024-08-26 00:55:58

tornado学习笔记19 Tornado框架分析的相关文章

Tornado 学习笔记3 tornado started

这个笔记是看Introduction.to.Tornado 一书时总结的. Tornado适合创建可灵活扩展的社区程序.实时的分析引擎,以及REST风格的API.由Bret Taylor等人为FriendFeed开发,后被Facebook收购. 多数的社区程序实时更新显示新消息,状态更改以及用户提示,需要客户端一直保持连接用来等待服务器的响应.使用线程模式的服务器如apache及其comet实现很容易因为达到线程池最大值,而无法接受新的请求. 相对于使用线程模式管理缓冲池的方式,Tornado使

Hadoop学习笔记—19.Flume框架学习

START:Flume是Cloudera提供的一个高可用的.高可靠的开源分布式海量日志收集系统,日志数据可以经过Flume流向需要存储终端目的地.这里的日志是一个统称,泛指文件.操作记录等许多数据. 一.Flume基础理论 1.1 常见的分布式日志收集系统 Scribe是facebook开源的日志收集系统,在facebook内部已经得到大量的应用. Chukwa 是一个开源的用于监控大型分布式系统的数据收集系统.这是构建在 hadoop 的 hdfs 和 map/reduce 框架之上的,继承了

C++ Primer 学习笔记_45_STL实践与分析(19)--泛型算法的结构

STL实践与分析 --泛型算法的结构 引言: 正如全部的容器都建立在一致的设计模式上一样,算法也具有共同的设计基础. 算法最主要的性质是须要使用的迭代器种类.全部算法都指定了它的每一个迭代器形參可使用的迭代器类型.比方,假设形參必须为随机訪问迭代器则可提供vector或 deque类型的迭代器,或者提供指向数组的指针.而其它容器的迭代器不能用在这类算法上. C++还提供了另外两种算法模式:一种模式由算法所带的形參定义;还有一种模式则通过两种函数命名和重载的规范定义. 一.算法的形參模式 大多数的

hadoop 学习笔记:mapreduce框架详解

hadoop 学习笔记:mapreduce框架详解 开始聊mapreduce,mapreduce是hadoop的计算框架,我 学hadoop是从hive开始入手,再到hdfs,当我学习hdfs时候,就感觉到hdfs和mapreduce关系的紧密.这个可能是我做技术研究的 思路有关,我开始学习某一套技术总是想着这套技术到底能干什么,只有当我真正理解了这套技术解决了什么问题时候,我后续的学习就能逐步的加快,而学习 hdfs时候我就发现,要理解hadoop框架的意义,hdfs和mapreduce是密不

黑马程序员_OC学习笔记之Foundation框架集合类

OC--集合类 1.OC集合类包括NSArray,NSSet,NSDictionary都是以面向对象的方式操作数组,而且OC数组不像C语言中的数组只能存放同一种数据类型,它可以存放任意类型的对象,但是不能存放非OC对象类型如基本数据类型int,struct,enum等 2.OC数组是以对象的方式存在,因此在创建的时候需要为创建的对象前面加* 3.NSArray数组一旦创建就决定了是不是可变,而且永远是可变或不可变 4.NSArray数组和子类NSMutableArray的基本操作: 1>使用NS

黑马程序员-OC学习笔记之Foundation框架NSNumber、NSValue和NSDate

---------------------- IOS开发.Android培训.期待与您交流! ---------------------- 一.NSNumber 前几篇笔记中,小桥复习了Foundatio框架中的几个类,这三个是OC学习的尾声了. 小桥已经复习过OC数组类NSArray,也说过它只能存放OC的对象,对于基本的数据类型确无能为力,但是实际编程中经常要把基本的数据如int.float,结构体存放的OC数组中,怎么办?这里的NSNumber就有用了,它能够把基本数据类型包装成OC对象.

Oracle 学习笔记 19 -- 触发器和包浅析(PL/SQL)

触发器是存放在数据库中的一种特殊类型的子程序.不能被用户直接调用,而是当特定事件或操作发生时由系统自己主动 调用执行.触发器不能接受參数.所以执行触发器就叫做触发或点火.Oracle事件指的是数据库的表进行的insert .update.delete操作或对视图进行类似的操作. 触发器是很多关系数据库系统都提供的一项技术.在Oracle系统里,触发器类似过程和函数,都有声明,运行和异常 处理过程的PL/SQL块. 触发器的组成: 触发事件:在何种情况下触发:比如:INSERT , UPDATE

springmvc学习笔记(19)-RESTful支持

springmvc学习笔记(19)-RESTful支持 springmvc学习笔记19-RESTful支持 概念 REST的样例 controller REST方法的前端控制器配置 对静态资源的解析 本文介绍RESTful的概念,并通过一个小样例展示怎样编写RESTful风格的controller和配置前端控制器,最后展示静态资源的解析 概念 首先附上两篇博客链接 理解RESTful架构 - 阮一峰的网络日志 RESTful API 设计指南- 阮一峰的网络日志 RESTful架构.就是眼下最流

Ext.Net学习笔记19:Ext.Net FormPanel 简单用法

Ext.Net学习笔记19:Ext.Net FormPanel 简单用法 FormPanel是一个常用的控件,Ext.Net中的FormPanel控件同样具有非常丰富的功能,在接下来的笔记中我们将一起见证FormPanel的强大. FieldLabel FieldLabel属性是每一个Field都具有的属性,它为我们的字段显示一个标签,例如上面登陆窗口中的“用户名”和“密码”. 我们可以通过LabelWidth控制标签的长度,例如我们设置用户名字段的LabelWidth="80": L