前面我们对 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. Linux内核分析:实验八--Linux进程调度与切换

    刘畅 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 概述 这篇文章主要分析Li ...

  2. asp 支付宝 企业版 接口 支持网银接口 ,网银直接支付

    asp 支付宝 企业版 接口 支持网银接口 ,网银直接支付 仅仅是多了一个defalutbank的參数. 详细看 open.alipay.com <% ' 类名:AlipaySubmit ' 功 ...

  3. HDU 5303 Delicious Apples(思维题)

    Delicious Apples Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Other ...

  4. 点滴积累【other】---存储过程删除所有表中的数据(sql)

    USE [QG_Mis24] GO /****** Object: StoredProcedure [dbo].[p_set1] Script Date: 07/18/2013 13:25:57 ** ...

  5. Spark-shell 启动WARN---java.net.BindException: Address already in use

    同时打开了两个SecureCRT的终端界面,其中一个已经进入了Spark-shell,在另一个SecureCRT界面中执行 "spark-shell --master yarn --depl ...

  6. python学习之logging模块

    Logger.setLevel(level) 设置记录器的级别为level.低于该级别的信息将被忽略. 记录器默认级别为NOTSET.如果记录器是根记录器,则默认将记录所有信息: 如果是一个非根记录器 ...

  7. Greatest Number 山东省第一届省赛

    Greatest Number Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 Saya likes math, because ...

  8. ruby之各种概念

    一.引言 刚开始接触ruby,遇到问题于是上网查资料,但是有时候却又看不懂,这很大一部分原因是我不知道一些关于ruby的概念名词是什么意思,所以看了别人的回答也理解不了. 二.各种名词 ruby:这个 ...

  9. 在Windows7和Ubuntu上编译安装MICO

    MICO是CORBA标准的一个实现.开源并且被广泛使用. 首先的首先,看用户手册,在页面"http://www.mico.org/docu.html"找到一本教材"MIC ...

  10. JQuery File Upload 插件 出现 “empty file upload result” 错误的解决方案。

    本例中采用的是 JQuery File Upload + ASP.NET 的方式, Google了大半天基本没有找到合理的解决方案,倒是在 NodeJS的一遍博客中找到了灵感:http://www.i ...