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框架分析的更多相关文章

  1. Tornado学习笔记12 tornado.httpserver-.非阻塞的Http服务器

    是一个非阻塞的,单线程的Http 服务器. 一般地,应用程序很少与HttpServer类直接交互,除非在进程开始时启动服务时(甚至在使用tornado.web.Applicaiton.listen时也 ...

  2. tornado 学习笔记9 Tornado web 框架---模板(template)功能分析

            Tornado模板系统是将模板编译成Python代码.         最基本的使用方式: t = template.Template("<html>{{ myv ...

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

    START:Flume是Cloudera提供的一个高可用的.高可靠的开源分布式海量日志收集系统,日志数据可以经过Flume流向需要存储终端目的地.这里的日志是一个统称,泛指文件.操作记录等许多数据. ...

  4. Tornado学习笔记(一) helloword/多进程/启动参数

    前言 当你觉得你过得很舒服的时候,你肯定没有在进步.所以我想学习新的东西,然后选择了Tornado.因为我觉得Tornado更匹配目前的我的综合素质. Tornado学习笔记系列主要参考<int ...

  5. tornado 学习笔记1 引言

    从事软件开发这行业也快5年啦,其实从事的工作也不完全是软件开发,软件开发只是我工作中的一部分.其中包括课题研究.信息化方案设计.软件开发.信息系统监理.项目管理等工作,比较杂乱.开发的软件比较多,但是 ...

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

    Ext.Net学习笔记19:Ext.Net FormPanel 简单用法 FormPanel是一个常用的控件,Ext.Net中的FormPanel控件同样具有非常丰富的功能,在接下来的笔记中我们将一起 ...

  7. SQL反模式学习笔记19 使用*号,隐式的列

    目标:减少输入 反模式:捷径会让你迷失方向 使用通配符和未命名的列能够达到减少输入的目的,但是这个习惯会带来一些危害. 1.破坏代码重构:增加一列后,使用隐式的Insert插入语句报错: 2.查询中使 ...

  8. golang学习笔记19 用Golang实现以太坊代币转账

    golang学习笔记19 用Golang实现以太坊代币转账 在以太坊区块链中,我们称代币为Token,是以太坊区块链中每个人都可以任意发行的数字资产.并且它必须是遵循erc20标准的,至于erc20标 ...

  9. go语言,golang学习笔记2 web框架选择

    go语言,golang学习笔记2 web框架选择 用什么go web框架比较好呢?能不能推荐个中文资料多的web框架呢? beego框架用的人最多,中文资料最多 首页 - beego: 简约 & ...

随机推荐

  1. 关于robotframework,app,appium的xpath定位问题及常用方法

    关于类似的帖子好像很多,但是没有找到具体能帮我解决问题的办法.还是自己深究了好久才基本知道app上面的xpath定位和web上的不同点: 先放一个图: A,先说说不用xpath的场景,一般是用于存在i ...

  2. DLL 生成与使用的全过程(2010-01-18 14:50:17)

    转载自 水滴的博客http://blog.sina.com.cn/spiritofwater   个人学习用 转载▼   分类: 技术 由dll导出的lib文件: 包含了每一个dll导出函数的符号名和 ...

  3. YII2之 Scenario

    使用方法 // scenario is set as a property $model = new User; $model->scenario = User::SCENARIO_SHOW; ...

  4. Nodejs 饭店

     一个Node.js饭店的发展历程 前面的一堆理论似乎不太好明白,最后讲一个关于饭店发展历程的故事作为结尾吧.     第一年 饭店开张,只有一个厨师(同时还兼任老板.服务员.打荷.收银员),当一个客 ...

  5. Camtasia 录屏说明

    准备好要录制的屏幕或网页,在即将播放的位置暂停住. 从开始菜单位置“TechSmith”启动Camtasia Recorder 8,其界面如下所示: 注意,要录制系统声音,须在Recorded inp ...

  6. SQL 基础

    创建模式 create schema <schema_name> authorization <username> 没有指定schema_name时默认是用户名 删除模式 dr ...

  7. 解决Mysql连接池被关闭 ,hibernate尝试连接不能连接的问题。 (默认mysql连接池可以访问的时间为8小时,如果超过8小时没有连接,mysql会自动关闭连接池。系统发布第二天访问链接关闭问题。

    解决Mysql连接池被关闭  ,hibernate尝试连接不能连接的问题. (默认MySQL连接池可以访问的时间为8小时,如果超过8小时没有连接,mysql会自动关闭连接池. 所以系统发布第二天访问会 ...

  8. Centos7下安装mysql5.7.16

    mysql的安装(root用户下) 从官网下载软件 linux下必须安装系统对应的版本,多少位 必须安装的是:server,client 但是我可不管要安装那个插件,我们直接使用bundle版本(就是 ...

  9. Ubuntu安装Mysqlcluster集群

    可参考:http://xuwensong.elastos.org/2014/01/13/ubuntu-%E4%B8%8Bmysql-cluster%E5%AE%89%E8%A3%85%E5%92%8C ...

  10. php.ini 配置详解【转载】

    [PHP]engine = On   #是否启用PHP解析引擎zend.ze1_compatibility_mode = Off #是否在Last-Modified应答头中放置该PHP脚本的最后修改时 ...