认识tornado(三)
实际上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(三)的更多相关文章
- web框架详解之tornado 三 url和分页
一.代码目录构建 controllers :处理业务逻辑的 account:处理账户相关的 上面目录作用和内容 controllers 包 :处理业务逻辑的 account:处理账户相关的 home ...
- Tornado—三种启动tornado的方式
第一种启动方式:单进程 import tornado.web # web服务 import tornado.ioloop # I/O 时间循环 class Mainhandler(tornado.we ...
- 三分钟了解 Python3 的异步 Web 框架 FastAPI
快速编码,功能完善.从启动到部署,实例详解异步 py3 框架选择 FastAPI 的原因. FastAPI 介绍 FastAPI 与其它 Python-Web 框架的区别 在 FastAPI 之前,P ...
- 在Windows上运行InfoPi
一.安装Python Python官网的下载页面: https://www.python.org/downloads/ 请下载Python 3.4或以上版本. (Python 3.5已不再支持Win ...
- Python高级应用(3)—— 为你的项目添加验证码
验证码简介 验证码的作用: 验证码在现在来说,是很常见的东西,可以一定程度的保护网站,比如防止网络爬虫恶意爬取网站数据啊,减少低级的攻击啊什么的.但是高级点的骚操作还是不太好防范,所以现在的验证码平台 ...
- Python框架之Tornado(三)请求
概述 本篇就来详细介绍tornado服务器(socket服务端)是如何接收用户请求数据以及如果根据用户请求的URL处理并返回数据,也就是上图的3 系列所有步骤,如上图[start]是一个死循环,其中利 ...
- 第三篇:白话tornado源码之请求来了
上一篇<白话tornado源码之待请求阶段>中介绍了tornado框架在客户端请求之前所做的准备(下图1.2部分),本质上就是创建了一个socket服务端,并进行了IP和端口的绑定,但是未 ...
- tornado框架之路三之ajax
一.ajax 1.传统的Web应用 一个简单操作需要重新加载全局数据 2.AJAX AJAX即“Asynchronous Javascript And XML”(异步JavaScript和XML),是 ...
- 第二百五十九节,Tornado框架-模板语言的三种方式
Tornado框架-模板语言的三种方式 模板语言就是可以在html页面,接收逻辑处理的self.render()方法传输的变量,将数据渲染到对应的地方 一.接收值渲染 {{...}}接收self.re ...
随机推荐
- 关于Assembly.LoadFrom和Assembly.LoadFile的区别
区别: 1.Assembly.LoadFile只载入相应的dll文件,比如Assembly.LoadFile("a.dll"),则载入a.dll,假如a.dll中引用了b.dll的 ...
- JMeter高速应用
过去长期用loadrunner做性能測试.可是渐渐认为有些麻烦了: 1.仅仅能执行在windows环境下,而生产环境差点儿清一色的linux.为了在同一网段做性能或压力測试,还须要单独部署一套wind ...
- win7配置两个tomcat(8 & 7)
背景如下: 电脑中原先tomcat版本是tomcat8,现在要再在其中另配置一个tomcat7,原先tomcat8的配的端口是8089 步骤如下: 1.官网下载tomcat7压缩包解压 2.修改D:\ ...
- java分页功能代码
import java.util.ArrayList; import java.util.List; /** * * @author cheney * * @date Aug 31, 2012 */ ...
- 解疑 Numpy 中的 transpose(转置)和swapaxes(两个轴转置变换)
1.一维和二维数据 .T等同于.transopse 2.三维及更多维数据 对于 z 轴 与 x 轴的变换 In [40]: arr = np.arange(16).reshape((2, 2, 4)) ...
- 关于nodejs中npm命令没有反应的解决方法
最近在学习angularJS,正在做一个单页面应用,在安装nodejs之后,发现命令行传了输入npm -v能输出结果外,其余npm的任何操作都没有反应,一开始我以为是下载的比较慢,等了半小时还是没动静 ...
- 用nodepad++生成导入数据的SQL
在工作中经常要往数据库里导入数据,如果是在本地,可以用SQL SERVER自带的工具 直接往表里导入或者 用ssis 导入 线上的数据库由dba负责,作为开发不能直接操作,需要程序员来生成sql语句, ...
- Android开发笔记之:Handler Runnable与Thread的区别详解
在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口:Thread类是在java.lang包中定义的.一 个类只要继承了Thread类同时覆写了本类中的run( ...
- redis命令_INCR
INCR key 将 key 中储存的数字值增一. 如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCR 操作. 如果值包含错误的类型,或字符串类型的值不能表示为数字,那 ...
- poj 1821 Fence(单调队列)
题目链接:http://poj.org/problem?id=1821 题目分析来自:http://blog.csdn.net/tmeteorj/article/details/8684453 连续的 ...