实际上handler有很多讲究,在Application类的注释中,就讲了不少。

1. 首先,(regexp,tornado.web.RequestHandler)中的第一个参数不是普通的字符串,而是正则表达式,这也是为什么示例中它 带了一个前缀“r”。这说明一个handler可以匹配很多个request。只要它们的request url能满足regexp匹配。

如果我们把刚才的

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

改成

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

只去掉了一个反斜杠,意义就大变。正则表达式中,句点“.”表示任意一个字符。

那么下面的URL将都会输出”Hello World”:

1    http://127.0.0.1:8888/hello.htm
2 http://127.0.0.1:8888/hello_htm
3 http://127.0.0.1:8888/hello1htm

以下的URL因为不符合[r"/hello.htm"]的规则,会输出404 Not Found。

1    http://127.0.0.1:8888/hello.html
2 http://127.0.0.1:8888/hello11htm

另外,这样的URL也会返回404 Not Found,你知道为什么吗?

1    http://127.0.0.1:8888/hello?htm

2. 可以定义多个handler tuple,形成一个列表(你可能已经注意到了,示例中application的参数是一个tuple列表)。用户请求到来时,会依次按列表中的handler进行匹配,第一个找到的匹配(不是最精确的那个匹配)会被调用。

3. 每个tuple都可以有第三个可选元素。这个元素是一个dictionary对象,它将作为参数传递给tuple中的Handler函数。比如:

1    application = web.Application([
2 (r"/static/(.*)", web.StaticFileHandler, {"path": "/var/www"}),
3 ])

4. 除了在Application的构造函数中直接定义Handler外,application对象也可以调用其add_handlers()方法来完成。这个函数还有一个额外的功能,即支持Virtual Host功能。

1    application.add_handlers(r"www\.nowamagic\.net", [(r"/article/([0-9]+)", ArticleHandler), ]) 

如上,www.nowamagic.net就是一个Virtual Host。什么是Virtual Host呢?

常规情况下,一个IP对应一个域名、一个网站,Virtual Host就是让一个IP上可以存在多个域名,每个域名对应不同的网站。

这个功能的实现其实很简单,网上有很多介绍,不罗嗦了。

5. 静态文件怎么办呢?比如图片文件,服务器唯一要做的就是把图片直接返回给客户,这就是web server默认的行为。我们根本不需要handler来处理(不是说不行,而是嫌它多此一举)。Application的handler也为静态文件提供了方便。

Tornado默认把网站根目录下的“/static/”子目录都作为静态路径看待,访问这下面的文件不需要经过handler动态处理,webserver自动会将文件返回给客户。它适合放一些不需要动态处理的图片,css样式表,音乐等等。

当然,这个路径是可以自己调整的,就在Application.__init__函数的settings参数中指定。

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

6. 你也看到了,settings参数是一个dictionary。这里面是一些杂项设置。下面是一个例子。

01    settings = dict(
02 blog_title=u"nowamagic",
03 template_path=os.path.join(os.path.dirname(__file__), "templates"),
04 static_path=os.path.join(os.path.dirname(__file__), "static"),
05 ui_modules={"Entry1": EntryModule, "topx": TopXModule},
06 xsrf_cookies=True,
07 cookie_secret="__TODO:_GENERATE_YOUR_OWN_RANDOM_VALUE_HERE__",
08 autoescape=None,
09 debug=True,
10 )

settings 里面提供的,既有tornado的内置选项(比如static_path,cokeei_secret, debug等),也有用户自定义选项(如blog_title)。内置选项会由Application类自己处理,自定义选项则需要用户自己写程序处理。

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

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

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

  1. web框架详解之tornado 三 url和分页

    一.代码目录构建 controllers  :处理业务逻辑的 account:处理账户相关的 上面目录作用和内容 controllers 包 :处理业务逻辑的 account:处理账户相关的 home ...

  2. Tornado—三种启动tornado的方式

    第一种启动方式:单进程 import tornado.web # web服务 import tornado.ioloop # I/O 时间循环 class Mainhandler(tornado.we ...

  3. 三分钟了解 Python3 的异步 Web 框架 FastAPI

    快速编码,功能完善.从启动到部署,实例详解异步 py3 框架选择 FastAPI 的原因. FastAPI 介绍 FastAPI 与其它 Python-Web 框架的区别 在 FastAPI 之前,P ...

  4. 在Windows上运行InfoPi

    一.安装Python Python官网的下载页面:  https://www.python.org/downloads/ 请下载Python 3.4或以上版本. (Python 3.5已不再支持Win ...

  5. Python高级应用(3)—— 为你的项目添加验证码

    验证码简介 验证码的作用: 验证码在现在来说,是很常见的东西,可以一定程度的保护网站,比如防止网络爬虫恶意爬取网站数据啊,减少低级的攻击啊什么的.但是高级点的骚操作还是不太好防范,所以现在的验证码平台 ...

  6. Python框架之Tornado(三)请求

    概述 本篇就来详细介绍tornado服务器(socket服务端)是如何接收用户请求数据以及如果根据用户请求的URL处理并返回数据,也就是上图的3 系列所有步骤,如上图[start]是一个死循环,其中利 ...

  7. 第三篇:白话tornado源码之请求来了

    上一篇<白话tornado源码之待请求阶段>中介绍了tornado框架在客户端请求之前所做的准备(下图1.2部分),本质上就是创建了一个socket服务端,并进行了IP和端口的绑定,但是未 ...

  8. tornado框架之路三之ajax

    一.ajax 1.传统的Web应用 一个简单操作需要重新加载全局数据 2.AJAX AJAX即“Asynchronous Javascript And XML”(异步JavaScript和XML),是 ...

  9. 第二百五十九节,Tornado框架-模板语言的三种方式

    Tornado框架-模板语言的三种方式 模板语言就是可以在html页面,接收逻辑处理的self.render()方法传输的变量,将数据渲染到对应的地方 一.接收值渲染 {{...}}接收self.re ...

随机推荐

  1. ISP封了80和8080端口

    今天用自己的电脑做服务器,绑定了域名,路由映射什么的都做了,但是80和8080端口在外网怎么都访问不了,只在内网可以访问. 最后看有人说联通封了80和8080端口,真是遗憾,谨记于此,以后有时间了再来 ...

  2. XML-RPC.NET

    XML-RPC.NET 是一个 .NET 的客户端服务器的基于 XML-RPC 远程过程调用的框架. 示例代码: [XmlRpcUrl("http://betty.userland.com/ ...

  3. win10改win7如何设置bios教程

    情况一: 我们按del键(百度自己电脑.主板如何进入bios)进入主板bios后,我们通过键盘将选项移动到 Authentication 菜单(bios界面各不相同,可能不在此项,找到对应 secur ...

  4. unity3d控制模型的运动

    这里就不多做解释了,直接上代码,只为了备忘. public class HeroMove : MonoBehaviour { private float speed;//人物行动速度 private ...

  5. QT Unexpected CDB exit 问题的解决办法

    行QT进行debug时,提示 Unexpected CDB exit ,The CBD process terminated.. QtCreator 默认是没有调试器的,因此需要用户额外安装. win ...

  6. python --存储对象

    转自:http://www.cnblogs.com/vamei/archive/2012/09/15/2684781.html 在之前对Python对象的介绍中 (面向对象的基本概念,面向对象的进一步 ...

  7. core文件无堆栈信息定位的思路

    首先需要介绍一下,阅读此文需要有基本的汇编知识. 1.rbp(基址寄存器),rsp(堆栈寄存器),rip(指令寄存器). 2.程序执行时,没有遇到函数调用时,IP自增长,遇到函数调用时, 需要保存bp ...

  8. HTTP Basic auth认证

    Basic 概述 Basic 认证是HTTP 中非常简单的认证方式,因为简单,所以不是很安全,不过仍然非常常用. 当一个客户端向一个需要认证的HTTP服务器进行数据请求时,如果之前没有认证过,HTTP ...

  9. love2d教程33--window模块

    --love的window模块比较简单,直接贴代码了function love.load() io.stdout:setvbuf("no") -- 设置io为无缓存模式 --获取显 ...

  10. NGUI本地化

    之前在网上的NGUI本地化教程是基于老版本的了,现在用的3.7版本已经改了很多,以前的本地化教程有点不适用了. 1.资源: 本地化的txt文本起名叫做Chinese.txt,到resource目录下新 ...