学习tornado:介绍
前言
在python里面,有许多web framework。对于我来说,因为很长一段时间都在使用tornado,所以有了一些心得体会。虽然现在我的工作重点已经转向go了,但是我觉得还是有必要记录一下tornado的相关东西,毕竟我的高性能网络库 libtnet 就是参考tornado来设计的。
在这里,要说明一下,tornado采用的是2.4版本。
架构
tornado是一个典型的prefork + io event loop的web server架构,
从图上可以看出,tornado的架构是很简单清晰的。
- ioloop是tornado的核心,它就是一个io event loop,底层封装了select,epoll和kqueue,并根据不同的平台选择不同的实现。
- iostream封装了non-blocking socket,用它来进行实际socket的数据读写。
- TCPServer则是通过封装ioloop实现了一个简易的server,同时我们也在这里进行prefork的处理
- HTTPServer则是继承TCPServer实现了一个能够处理http协议的server。
- Application则是实际处理http请求的模块,HTTPServer收到http请求并解析之后会通过Application进行处理。
- RequestHandler和WebSocketHandler则是注册给Application用来处理对应url的。
- WSGIApplication则是tornado用于支持WSGI标准的接口,通过WSGIContainer包装共HTTPServer使用。
例子
通过上面的分析,直到tornado的架构是很简单明了的,所以自然我们也能够通过简短的一些代码就能搭建起自己的http server。以一个hello world开始:
import tornado.web
import tornado.httpserver
import tornado.ioloop
class MainHandler(tornado.web.RequestHandler):
def get(self):
self.write('Hello World')
application = tornado.web.Application([
(r"/", MainHandler),
])
http_server = tornado.httpserver.HTTPServer(application)
http_server.listen(8080)
tornado.ioloop.IOLoop.instance().start()
流程很简单,如下:
- 定义了一个MainHandler,该handler用来处理对应url
- 生成一个Application实例,并设置url dispatch规则,(r"/", MainHandler)就是一个规则,第一个pattern用来表明需要处理的url,内部会使用正则匹配,第二个就是对应url处理的handler
- 生成一个HTTPServer实例,使用Application进行构造,这样HTTPServer处理的http请求就会转给application处理。
- HTTPServer监听一个端口8080,该listen socket会加入ioloop中,用于监听连接的建立。
- ioloop启动,程序进入io event loop模式。
当ioloop start之后,服务器就启动了,后续就是一个http server最基本的流程处理了。
ReuqestHandler
pattern and handler
从上面例子可以看出,搭建一个http server很简单,所以我们重点只需要考虑的是如何处理不同的url http请求,这也就是RequestHandler需要做的事情。
我们在创建Application的时候,会指定不同的url pattern需要处理的handler。如下:
import tornado.web
import tornado.httpserver
import tornado.ioloop
class Index1Handler(tornado.web.RequestHandler):
def get(self):
self.write('Index1')
class Index2Handler(tornado.web.RequestHandler):
def get(self, data):
self.write('Index2')
self.write(data)
application = tornado.web.Application([
(r"/index1", Index1Handler),
(r"/index2/(\w+)", Index2Handler),
])
http_server = tornado.httpserver.HTTPServer(application)
http_server.listen(8080)
tornado.ioloop.IOLoop.instance().start()
在上面的例子中,我们有两个handler,分别处理url path为index1和index2的情况,对于index2来说,我们看到,它后面还需要匹配一个单词。我们通过curl访问如下:
$ curl http://127.0.0.1:8080/index1
index1
$ curl http://127.0.0.1:8080/index2/abc
index2abc
http method
RequestHandler支持任何http mthod,包括get,post,head和delete,也就是说,tornado天生支持restful编程模型。
class MainHandler(tornado.web.RequestHandler):
def get(self):
pass
def post(self):
pass
def head(self):
pass
def delete(self):
pass
从上面可以看到,我们只需要在handler里面实现自己的get,post,head和delete函数就可以了,这点再次说明tornado的简洁与强大。
后续next
这里,只是简单了介绍了一下tornado,后续将会从template,asynchronous,security等分别介绍一下。希望通过这个能让自己对tornado的理解更加深刻,同时也为后续使用其他python web framework做参考。
学习tornado:介绍的更多相关文章
- C# BackgroundWorker组件学习入门介绍
C# BackgroundWorker组件学习入门介绍 一个程序中需要进行大量的运算,并且需要在运算过程中支持用户一定的交互,为了获得更好的用户体验,使用BackgroundWorker来完成这一功能 ...
- Android Testing学习01 介绍 测试测什么 测试的类型
Android Testing学习01 介绍 测试测什么 测试的类型 Android 测试 测什么 1.Activity的生命周期事件 应该测试Activity的生命周期事件处理. 如果你的Activ ...
- 第一次学习tornado小练习
内容 这次是python的一个web框架,tornado,这个web框架在python的几个web框架中一个比较简单的web框架,刚开始接触python的时候就知道python有两个比较常用的web框 ...
- Redis学习01——介绍与搭建环境
Redis学习01介绍与搭建环境一简介二yum配置已经配置了的可以跳过三安装gcc四安装redis1 上传Redis到linux中2 解压到usrlocal下3 编译redis4 安装redis5 拷 ...
- 深度学习与CV教程(8) | 常见深度学习框架介绍
作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/37 本文地址:http://www.showmeai.tech/article-det ...
- 小白学习tornado第二站-tornado简单介绍
tornado基本web应用结构 分为两大块类 Application对象(只会实例化一次) 路由表URl映射 (r'/', MainHandler) 关键词参数settings RequestHan ...
- Caffe 深度学习框架介绍
转自:http://suanfazu.com/t/caffe/281 Caffe是一个清晰而高效的深度学习框架,其作者是博士毕业于UC Berkeley的贾扬清,目前在Google工作. Caffe是 ...
- Ext学习-布局介绍
1.目标 了解ExtJS中的关于布局和组建的相关原理,并学习相关的布局方式 2.内容 1.布局和组件的相关原理 2.常见的布局方式 3.学习流程 1.首先应该学习一下布局和组件的相 ...
- Hibernate学习---基本介绍+作用+配置
从今天开始重新学习(以前学的太匆忙)Hibernate,这篇文章主要就一下几点进行讲解和说明: Hibernate的基本介绍 Hibernate的作用 Hibernate基本配置 Hibernate的 ...
随机推荐
- Java面试19|过于深入的问题
1.synchronized关键字的实现原理 可以参考:http://www.jianshu.com/p/c5058b6fe8e5 2.CAS是由Unsafe类的compareAndSwap()方法实 ...
- Java为什么要配置环境变量及如何配置环境变量
在没有配置环境变量之前,用cmd执行Java文件,需要指明Java的可执行文件,否则无法运行. 配置环境是为了在不用切换可执行文件目录下,方便Java程序的执行和控制. 那么环境变量就是让系统根据环境 ...
- ACM Meteor Shower
贝茜听到一场非同寻常的流星雨( meteor shower)即将来临;有报道称这些流星将撞击地球并摧毁它们所击中的任何东西.为了安全起见(Anxious for her safety), ,她发誓(v ...
- 分别用face++和百度获取人脸属性(python单机版)
称之为单机版,主要是相对于调用摄像头实时识别而言.本篇主要py2下利用face++和百度接口获取本地图片中的人脸属性,并按照一定格式保存数据. face++版 face++是刚注册的,只能用一个试用的 ...
- 【伯乐在线】这些 Git 技能够你用一年了
原文出处: Pyper 欢迎分享原创到伯乐头条 用git有一年了,下面是我这一年来的git使用总结,覆盖了日常使用中绝大多数的场景.嗯,至少是够用一年了,整理出来分享给大家,不明白的地方可以回复交 ...
- Linux 性能监测:IO
磁盘通常是计算机最慢的子系统,也是最容易出现性能瓶颈的地方,因为磁盘离 CPU 距离最远而且 CPU 访问磁盘要涉及到机械操作,比如转轴.寻轨等.访问硬盘和访问内存之间的速度差别是以数量级来计算的,就 ...
- IntelliJ IDEA在Local模式下Spark程序消除日志中INFO输出
在使用Intellij IDEA,local模式下运行Spark程序时,会在Run窗口打印出很多INFO信息,辅助信息太多可能会将有用的信息掩盖掉.如下所示 要解决这个问题,主要是要正确设置好log4 ...
- AR模块常用函数
--AR模块常用函数 FUNCTION get_fnd_user_name ( p_user_id IN NUMBER ) return VARCHAR2 IS CURSOR c_user_name ...
- 【SSH系列】-- hibernate基本原理&&入门demo
什么是hibernate? hibernate在英文中是冬眠的意思,当冬季来临,世界万物开始准备冬眠,但是程序猿这种动物好像不冬眠,因为需求变了,要改bug,冬眠,对于对象来说就是持 ...
- Python模块探秘之EasyGui
在Windows想用Python开发一些简单的界面,所以找到了很容易上手的EasyGui库.下面就分享一下简单的使用吧. 参考的链接:官网Tutorial 接下来,我将从简单,到复杂一点点的演示如何使 ...