3.关于Tornado handler的更多细节 (副标题:一些要注意的问题)
2016-05-29 15:52
615 查看
实际上handler有很多讲究,在Application类的注释中,就讲了不少。
1. 首先,(regexp,tornado.web.RequestHandler)中的第一个参数不是普通的字符串,而是正则表达式,这也是为什么示例中它带了一个前缀“r”。这说明一个handler可以匹配很多个request。只要它们的request url能满足regexp匹配。
如果我们把刚才的
改成
只去掉了一个反斜杠,意义就大变。正则表达式中,句点“.”表示任意一个字符。
那么下面的URL将都会输出”Hello World”:
以下的URL因为不符合[r"/hello.htm"]的规则,会输出404 Not Found。
另外,这样的URL也会返回404 Not Found,你知道为什么吗?
2. 可以定义多个handler tuple,形成一个列表(你可能已经注意到了,示例中application的参数是一个tuple列表)。用户请求到来时,会依次按列表中的handler进行匹配,第一个找到的匹配(不是最精确的那个匹配)会被调用。
3. 每个tuple都可以有第三个可选元素。这个元素是一个dictionary对象,它将作为参数传递给tuple中的Handler函数。比如:
4. 除了在Application的构造函数中直接定义Handler外,application对象也可以调用其add_handlers()方法来完成。这个函数还有一个额外的功能,即支持Virtual
Host功能。
如上,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参数中指定。
6. 你也看到了,settings参数是一个dictionary。这里面是一些杂项设置。下面是一个例子。
settings 里面提供的,既有tornado的内置选项(比如static_path,cokeei_secret, debug等),也有用户自定义选项(如blog_title)。内置选项会由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 |
1 | http: / / 127.0 . 0.1 : 8888 / hello.html |
2 | http: / / 127.0 . 0.1 : 8888 / hello11htm |
1 | http: / / 127.0 . 0.1 : 8888 / hello?htm |
3. 每个tuple都可以有第三个可选元素。这个元素是一个dictionary对象,它将作为参数传递给tuple中的Handler函数。比如:
1 | application = web.Application([ |
2 | (r "/static/(.*)" , web.StaticFileHandler, { "path" : "/var/www" }), |
3 | ]) |
Host功能。
1 | application.add_handlers(r "www\.nowamagic\.net" , [(r "/article/([0-9]+)" , ArticleHandler), ]) |
常规情况下,一个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): |
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 | ) |
这些选项的用途,我们后面会逐渐讲到。
相关文章推荐
- Python动态类型的学习---引用的理解
- Python3写爬虫(四)多线程实现数据爬取
- 垃圾邮件过滤器 python简单实现
- 下载并遍历 names.txt 文件,输出长度最长的回文人名。
- install and upgrade scrapy
- Scrapy的架构介绍
- Centos6 编译安装Python
- 使用Python生成Excel格式的图片
- 让Python文件也可以当bat文件运行
- [Python]推算数独
- Python中zip()函数用法举例
- Python中map()函数浅析
- Python将excel导入到mysql中
- Python在CAM软件Genesis2000中的应用
- 使用Shiboken为C++和Qt库创建Python绑定
- FREEBASIC 编译可被python调用的dll函数示例
- Python 七步捉虫法