实际上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

最新文章

  1. [bigdata] 从Cloudera Manager中彻底删除服务器
  2. cocos2d-js去掉左下角的三行数字(帧数)
  3. UITextField的总结
  4. Java中boolean型变量的默认值问题
  5. 发起SSH攻击主机IP地址列表
  6. Gora快速入门
  7. SqlServer判断数据库、表、存储过程、函数是否存在
  8. STL系列
  9. python爬虫入门---第四篇:网站对爬虫的限制及突破测试
  10. 第五章 绘图基础(LINEDEMO)
  11. WeRun is mini-app
  12. vbs学习笔记2——创建桌面快捷方式
  13. spring boot成功启动后访问报错404的问题
  14. LeetCode: Search Insert Position 解题报告
  15. JAVA 定时器时间格式
  16. PL/SQL编辑数据"这些查询结果不可更新,请包括ROWID或使用SELECT...FOR UPDATE获得可更新结果"处理
  17. python 使用pyinstaller,pywin32打包.py成.exe应用程序
  18. 基于log4j的消息流的实现之二消息传递
  19. 如何安装搜索引擎Elasticsearch?
  20. HTML?这些还不懂咋办?

热门文章

  1. setjmp与longjmp
  2. Django Error: That port is already in use.
  3. centos 7 生成文件名乱码的问题如何解决?
  4. 详解Struts1中的struts-config.xml配置文件【一】
  5. ss - float浮动模块的高度问题 解决方案
  6. C#通过WIN32 API实现嵌入程序窗体
  7. JSP应用开发 -------- 电纸书(未完待续)
  8. c++ friend 遇到 namespace 无法访问 private 成员的问题
  9. Dreamhost 提示No input file specified. 的解决的方法
  10. zookeeper安装与集群搭建