前面我们对 Tornado 自带的 hello world 作了代码组织上的解释,但是没有更加深入细致地解释。这里我们直接从main()函数开始,单步跟随,看看tornado都干了些什么。

下面是 main() 函数的定义:

1    def main():
2 tornado.options.parse_command_line()
3 application = tornado.web.Application([
4 (r"/", MainHandler),
5 ])
6 http_server = tornado.httpserver.HTTPServer(application)
7 http_server.listen(options.port)
8 tornado.ioloop.IOLoop.instance().start()

先从第一行开始:

1    tornado.options.parse_command_line()

这一句是解析命令行参数,函数定义在tornado/options.py里。注意,在options.py里有两个parse_command_line()的定义。一个是OptionParser类的成员函数:

1    class OptionParser(object):
2 def parse_command_line(self, args=None, final=True):

另一个是普通的函数,不过它的实现是直接调用OptionParser的实现。

1    def parse_command_line(args=None, final=True):
2 return options.parse_command_line(args, final=final)

直接看OptionParser中的实现。简短的注释,parse_command_line()默认是解析sys.argv中的参数。我们在运行 helloworld.py时,后面跟的参数在这里处理。命令行参数的解析过程很简单,没有什么需要特别关注。再者,我们现在没有使用任何命令行参数,所 以先略过。

接下来:

1    application = tornado.web.Application([
2 (r"/", MainHandler), ])

这一句虽然简单,但信息量略大。首先,tornado.web.Application是一个tornado内置的类,定义在 tornado/web.py中。从它大段的注释就可以看出来,这个类至少是男二号。按tornado的说法,Application类实际是一些 Handler的集合,这些Handler组成了一个web应用程序。

什么是handler呢?

当用户访问你的网站时,它会提交一个URL,表示“把这个地址的数据给我”,这个URL可能是一张网页,比如http://abc.com /1.htm,也可能是一张图片,比如 http://abc.com/2.jpg 。数据被传送到浏览器后,经过渲染,就是大家看到的网站的样子。对每个这样的URL,在tornado上可以针对性的设置一个函数来处理。 比如http://abc.com/1.htm我们就交给一个叫handle_1_htm()的函数,http://abc.com/2.jpg交给一个 叫handle_2_jpg()的函数。它们分别负责将客户请求的内容通过http协议返回给客户端。这些函数,就叫handler。

相比于普通的静态http,这种handler机制提供了更多的灵活性。比如,1.htm可能每次都是根据数据库中内容动态生成的,再返回给用户的 资料可以每次都不一样。又比如:可能服务器上根本不存在2.jpg这样一个文件,handle_2_jpg()函数实际上从服务器连接的摄像头上去拍一张 图来,然后返回给用户。用tornado开发网站,大部分的工作都是在写这样的 handler

上面这一句,是初始化了一个Application的实例,保存在application变量中。

Application的初始化参数是非常讲究的。在Application类的说明里,大段的话都是在讲参数的事。

示例中的参数比较简单:

1    application = tornado.web.Application([(r"/", MainHandler), ])

我们看Applicatino类的__init__函数原型:

1    def __init__(self, handlers=None, default_host="", transforms=None, wsgi=False, **settings): 

可见helloword.py只提供了handlers这个参数值。handlers实际上是一个列表,每个元素是 (regexp,tornado.web.RequestHandler)这样的tuple。前面讲过,handler与用户请求之间存在映射关系,这个 关联就是在这里定义的。

1    (r"/", MainHandler)

这就表示,如果用户请求的是网站根目录,就调用MainHandler来处理。前面我们直接输入 http://127.0.0.1:8888 ,其实就是访问的根目录,我们看到的hello world输出就是由MainHandler输出的。后面分析MainHandler时再详述。

如果我们访问一个没有定义handler的URL(比如http://127.0.0.1/1.htm )会发生什么?

很简单,告诉你找不到!再做个实验,把

1    application = tornado.web.Application([(r"/", MainHandler),])

改成:

1    application = tornado.web.Application([ (r"/hello\.htm", MainHandler), ]) 

注意,因为是正则式,所以我们在点号前加了反斜杠。再尝试访问http://127.0.0.1:8888,会404了。

换我们改过的URL,http://127.0.0.1:8888/hello.htm,可爱的“hello world”又回来了。

现在你应该理解handler是怎么回事了。

同时这提醒我们,浏览器地址栏中的URL并不一定表示服务器上真的就存在这样一个文件。它完全可能是web服务器上虚拟映射的一个路径而已。比如刚才的hello.htm。

由于这是hello world级别的示例,所以handler只有一个,且非常之简单。

认识tornado(一)
认识tornado(二)
认识tornado(三)
认识tornado(四)
认识tornado(五)

来源:http://www.nowamagic.net/academy/detail/1332566

认识tornado(二)的更多相关文章

  1. web框架详解之tornado 二 cookie

    一.tornado之cookie一 目录: <!DOCTYPE html> <html lang="en"> <head> <meta c ...

  2. Tornado(二)

    跨站请求伪造CSRF 开启xsrf(就是叫法不一样和csrf一样),'xsrf_cookies':True settings = { 'template_path':'template', 'stat ...

  3. tornado 01 路由、输入与输出

    tornado 01 路由.输入与输出 一.安装tornado pyvip@Vip:~$ workon py3env #安装python3的虚拟环境 (py3env) pyvip@Vip:~$ pip ...

  4. tornado框架的简单实用

    一.安装模块 pip3 install tornado 二.简单的起服务的方法 import json, datetime from tornado.web import RequestHandler ...

  5. Python之Tornadoweb框架使用

    本文主要讲解Tornadoweb框架的安装和介绍及其简单使用. 一. 安装介绍 Tornado是一个Python Web框架和异步网络库,最初是在FriendFeed上开发的.通过使用非阻塞网络I / ...

  6. pip下载加速的方式

    两种方式 一.临时方式 可以在使用pip的时候加参数-i https://pypi.tuna.tsinghua.edu.cn/simple. 例如下载或者更新: 下载:pip install -i h ...

  7. Python框架之Tornado(二)请求阶段

    概述 上图是tornado程序启动以及接收到客户端请求后的整个过程,对于整个过程可以分为两大部分: 启动程序阶段,又称为待请求阶段(上图1.2所有系列和3.0) 接收并处理客户端请求阶段(上图3系列) ...

  8. 【tornado】系列项目(二)基于领域驱动模型的区域后台管理+前端easyui实现

    本项目是一个系列项目,最终的目的是开发出一个类似京东商城的网站.本文主要介绍后台管理中的区域管理,以及前端基于easyui插件的使用.本次增删改查因数据量少,因此采用模态对话框方式进行,关于数据量大采 ...

  9. tornado框架之路二

    二.路由系统 路由系统其实就是 url 和 类 的对应关系,这里不同于其他框架,其他很多框架均是 url 对应 函数,Tornado中每个url对应的是一个类. #!/usr/bin/env pyth ...

  10. python运维开发(二十二)---JSONP、瀑布流、组合搜索、多级评论、tornado框架简介

    内容目录: JSONP应用 瀑布流布局 组合搜索 多级评论 tornado框架简介 JSONP应用 由于浏览器存在同源策略机制,同源策略阻止从一个源加载的文档或脚本获取或设置另一个源加载的文档的属性. ...

随机推荐

  1. gulp入门学习教程(入门学习记录)

    前言 最近在通过教学视频学习angularjs,其中有gulp的教学部分,对其的介绍为可以对文件进行合并,压缩,格式化,监听,测试,检查等操作时,看到前三种功能我的心理思想是,网上有很多在线压缩,在线 ...

  2. 为何 IntelliJ IDEA 比 Eclipse 更好

    http://www.oschina.net/news/26929/why-intellij-is-better-than-eclipse圣战 有一些没有唯一正确答案的“永恒”的问题,例如哪个更好:是 ...

  3. Linxu 监控命令总结

    free –m [root@web1476 ~]# free        total       used       free     shared    buffers     cached M ...

  4. PL/SQL TOAD 不安装Oracle客户端连接数据库的方法

    不安装Oracle客户端连接数据库的方法 本机环境: win7 64位中文旗舰版 一.准备工作: 1)到ORACLE官网下载instantclient,下载地址:http://www.oracle.c ...

  5. Powerdesign使用小技巧(转载)

    1.做CDM模型的时候,因为开始定义ITEM的时候,没有注意把NAME和CODE全定义成一样的.结果后面想改的时候比较麻烦,一修改NAME结果CODE也变了.后来找到两个方法可以解决这个问题.A.Po ...

  6. SQL Server 保存不了修改后的表的解决方法

    客户端报错(配图): 出现问题环境:在新建一个表之后,又想添加一个字段保存表,提示错误. 解决方案:在SQL Server 2008R2 中 对于对于重新保存新建表系统默认设置为“阻止”,在对应设置解 ...

  7. Atitti.数据操作crud js sdk dataServiceV3设计说明

    Atitti.数据操作crud js sdk dataServiceV3设计说明 1. 增加数据1 1.1. 参数哦说明1 2. 查询数据1 2.1. 参数说明2 3. 更新数据2 3.1. 参数说明 ...

  8. MongoDB 将Json数据直接写入MongoDB的方法

    Json转Bson MongoDB中是以Bson数据格式进行存储的,Json字符串没有办法直接写入MongoDB 可以将Json字符串转换成DBObject或者Document,然后写入MongoDB ...

  9. datatables 相关文章

    http://blog.csdn.net/zhu_xiao_yuan/article/details/51252300 datatables参数配置详解  http://blog.csdn.net/j ...

  10. ZThread在Windows下打印若干DEBUG信息到console的原因

    代码见这篇随笔 在Windows下的运行结果:ZThread打印了一堆东西(并不是我写的) 文件结构: 最开始我以为是编译选项没弄对,同样的代码放到Linux下编译,还是打印这些信息 注意我在Linu ...