网站首页学无止境PYTHON

python框架Tornado之二Tornado 攻略(1)

发布时间:2014-07-25 17:01:15编辑:songlin阅读(157)

    Tornado 攻略

    请求处理程序和请求参数

    Tornado 的 Web 程序会将 URL 或者 URL 范式映射到 tornado.web.RequestHandler 的子类上去。在其子类中定义了get() 或 post() 方法,用以处理不同的 HTTP 请求。

    下面的代码将 URL 根目录 / 映射到 MainHandler,还将一个 URL 范式 /story/([0-9]+) 映射到 StoryHandler。正则表达式匹配的分组会作为参数引入 的相应方法中:
     

    1. class MainHandler(tornado.web.RequestHandler): 
    2.     def get(self): 
    3.         self.write("You requested the main page"
    4.  
    5. class StoryHandler(tornado.web.RequestHandler): 
    6.     def get(self, story_id): 
    7.         self.write("You requested the story " + story_id) 
    8.  
    9. application = tornado.web.Application([ 
    10.     (r"/", MainHandler), 
    11.     (r"/story/([0-9]+)", StoryHandler), 
    12. ]) 

    你可以使用 get_argument() 方法来获取查询字符串参数,以及解析 POST 的内容:
     

    1. class MainHandler(tornado.web.RequestHandler): 
    2.     def get(self): 
    3.         self.write('
    4.                    ''
    5.                    ''
    6.                    ''
    7.  
    8.     def post(self): 
    9.         self.set_header("Content-Type""text/plain"
    10.         self.write("You wrote " + self.get_argument("message")) 

    上传的文件可以通过 self.request.files 访问到,该对象将名称(HTML元素 的 name 属性)对应到一个文件列表。每一个文件都以字典的形式 存在,其格式为 {"filename":..., "content_type":..., "body":...}
    如果你想要返回一个错误信息给客户端,例如“403 unauthorized”,只需要抛出一个 tornado.web.HTTPError 异常:
     

    1. if not self.user_is_logged_in(): 
    2.     raise tornado.web.HTTPError(403

    请求处理程序可以通过 self.request 访问到代表当前请求的对象。该 HTTPRequest 对象包含了一些有用的属性,包括:

    • arguments - 所有的 GET 或 POST 的参数
    • files - 所有通过 multipart/form-data POST 请求上传的文件
    • path - 请求的路径( ? 之前的所有内容)
    • headers - 请求的开头信息
    • 你可以通过查看源代码 httpserver 模组中 HTTPRequest 的定义,从而了解到它的 所有属性。

      重写 RequestHandler 的方法函数

      除了 get()/post()等以外,RequestHandler 中的一些别的方法函数,这都是 一些空函数,它们存在的目的是在必要时在子类中重新定义其内容。对于一个请求的处理 的代码调用次序如下:

      1. 程序为每一个请求创建一个 RequestHandler 对象
      2. 程序调用 initialize() 函数,这个函数的参数是 Application 配置中的关键字 参数定义。(initialize 方法是 Tornado 1.1 中新添加的,旧版本中你需要 重写 __init__ 以达到同样的目的) initialize 方法一般只是把传入的参数存 到成员变量中,而不会产生一些输出或者调用像 send_error 之类的方法。
      3. 程序调用 prepare()。无论使用了哪种 HTTP 方法,prepare 都会被调用到,因此 这个方法通常会被定义在一个基类中,然后在子类中重用。prepare可以产生输出 信息。如果它调用了finish(或send_error` 等函数),那么整个处理流程 就此结束。
      4. 程序调用某个 HTTP 方法:例如 get()post()put() 等。如果 URL 的正则表达式模式中有分组匹配,那么相关匹配会作为参数传入方法。

      下面是一个示范 initialize() 方法的例子:
       

      1. class ProfileHandler(RequestHandler): 
      2.     def initialize(self, database): 
      3.         self.database = database 
      4.  
      5.     def get(self, username): 
      6.         ... 
      7.  
      8. app = Application([ 
      9.     (r'/user/(.*)', ProfileHandler, dict(database=database)), 
      10.     ]) 

      其它设计用来被复写的方法有:

      • get_error_html(self, status_code, exception=None, **kwargs) - 以字符串的形式 返回 HTML,以供错误页面使用。
      • get_current_user(self) - 查看下面的用户认证一节
      • get_user_locale(self) - 返回 locale 对象,以供当前用户使用。
      • get_login_url(self) - 返回登录网址,以供 @authenticated 装饰器使用(默认位置 在 Application 设置中)
      • get_template_path(self) - 返回模板文件的路径(默认是 Application 中的设置)

      重定向(redirect)

      Tornado 中的重定向有两种主要方法:self.redirect,或者使用 RedirectHandler

      你可以在使用 RequestHandler (例如 get)的方法中使用 self.redirect,将用户 重定向到别的地方。另外还有一个可选参数 permanent,你可以用它指定这次操作为永久性重定向。

      该参数会激发一个 301 Moved Permanently HTTP 状态,这在某些情况下是有用的, 例如,你要将页面的原始链接重定向时,这种方式会更有利于搜索引擎优化(SEO)。

      permanent 的默认值是 False,这是为了适用于常见的操作,例如用户端在成功发送 POST 请求 以后的重定向。

      1. self.redirect('/some-canonical-page', permanent=True

      RedirectHandler 会在你初始化 Application 时自动生成。

      例如本站的下载 URL,由较短的 URL 重定向到较长的 URL 的方式是这样的:
       

      1. application = tornado.wsgi.WSGIApplication([ 
      2.     (r"/([a-z]*)", ContentHandler), 
      3.     (r"/static/tornado-0.2.tar.gz", tornado.web.RedirectHandler, 
      4.      dict(url="http://github.com/downloads/facebook/tornado/tornado-0.2.tar.gz")), 
      5. ], **settings) 

      RedirectHandler 的默认状态码是 301 Moved Permanently,不过如果你想使用 302 Found 状态码,你需要将permanent 设置为 False
       

      1. application = tornado.wsgi.WSGIApplication([ 
      2.     (r"/foo", tornado.web.RedirectHandler, {"url":"/bar""permanent":False}), 
      3. ], **settings) 

      注意,在 self.redirect 和 RedirectHandler 中,permanent 的默认值是不同的。 这样做是有一定道理的,self.redirect 通常会被用在自定义方法中,是由逻辑事件触发 的(例如环境变更、用户认证、以及表单提交)。而 RedirectHandler 是在每次匹配到请求 URL 时被触发。

本文来源地址:http://sebug.net/paper/books/tornado/