• 关于Tornado handler的更多细节

    一些要注意的问题
    服务器君一共花费 9.237 ms 进行了 4 次数据库查询,努力地为您提供了这个页面。
    广告很萌的

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

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

    如果我们把刚才的

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

    改成

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

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

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

    http://127.0.0.1:8888/hello.htm 
    http://127.0.0.1:8888/hello_htm
    http://127.0.0.1:8888/hello1htm
    

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

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

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

    http://127.0.0.1:8888/hello?htm
    

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

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

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

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

    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参数中指定。

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

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

    settings = dict( 
        blog_title=u"nowamagic", 
        template_path=os.path.join(os.path.dirname(__file__), "templates"), 
        static_path=os.path.join(os.path.dirname(__file__), "static"), 
        ui_modules={"Entry1": EntryModule, "topx": TopXModule}, 
        xsrf_cookies=True, 
        cookie_secret="__TODO:_GENERATE_YOUR_OWN_RANDOM_VALUE_HERE__", 
        autoescape=None, 
        debug=True, 
    ) 
    

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

    这些选项的用途,我们后面会逐渐讲到。

更多 推荐条目

Welcome to NowaMagic Academy!

现代魔法 推荐于 2013-02-27 10:23   

本章最新发布
随机专题
  1. [移动开发] Android抽屉导航NavigationDrawer 5 个条目
  2. [软件工程与项目管理] 浏览器与CSS渲染技巧 2 个条目
  3. [Python程序设计] 从PHP到Python 3 个条目
  4. [Python程序设计] Python语言概述 6 个条目
  5. [PHP程序设计] PHP扩展模块安装 1 个条目
  6. [移动开发] Android布局中的一些常用控件 2 个条目
  7. [计算机算法] 两数交换的各种算法细节 2 个条目
  8. [Python程序设计] Django架构流程分析 7 个条目
  9. [Python程序设计] Django 入门知识浅介 10 个条目
  10. [JavaScript程序设计] 关于HTTP Keep-Alive 6 个条目
  11. [移动开发] Layout_weight属性解析 5 个条目
  12. [PHP程序设计] 对输入文件类型的检测 1 个条目
窗口 -- [八点]