zoukankan      html  css  js  c++  java
  • Tornado 中的 get() 或 post() 方法

    ---恢复内容开始---

    Tornado 中的 get() 或 post() 方法

    请求处理程序和请求参数

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

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

    class MainHandler(tornado.web.RequestHandler):
        def get(self):
            self.write("You requested the main page")
    
    class StoryHandler(tornado.web.RequestHandler):
        def get(self, story_id):
            self.write("You requested the story " + story_id)
    
    application = tornado.web.Application([
        (r"/", MainHandler),
        (r"/story/([0-9]+)", StoryHandler),
    ])

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

    class MainHandler(tornado.web.RequestHandler):
        def get(self):
            self.write('<html><body><form action="/" method="post">'
                       '<input type="text" name="message">'
                       '<input type="submit" value="Submit">'
                       '</form></body></html>')
    
        def post(self):
            self.set_header("Content-Type", "text/plain")
            self.write("You wrote " + self.get_argument("message"))
    

      

    上传的文件可以通过 self.request.files 访问到,该对象将名称(HTML元素 <input type="file">的 name 属性)对应到一个文件列表。每一个文件都以字典的形式 存在,其格式为 {"filename":..., "content_type":..., "body":...}

    如果你想要返回一个错误信息给客户端,例如“403 unauthorized”,只需要抛出一个 tornado.web.HTTPError 异常:

    if not self.user_is_logged_in():
        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() 方法的例子:

    class ProfileHandler(RequestHandler):
        def initialize(self, database):
            self.database = database
    
        def get(self, username):
            ...
    
    app = Application([
        (r'/user/(.*)', ProfileHandler, dict(database=database)),
        ])

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

    • 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 请求 以后的重定向。

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

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

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

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

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

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

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

    ---恢复内容结束---

  • 相关阅读:
    java.lang.NoSuchMethodError
    asm相关内容想下载(包括 jar 包)
    Initialization of bean failed; nested exception is java.lang.NoClassDefFoundError: org/objectweb/asm/Type
    用Navicat连接mysql报错:2003-Can't connect to MySql server on '10.100.0.109'(10039)
    The type java.lang.reflect.AnnotatedElement cannot be resolved. It is indirectly referenced from required .class files
    The type java.lang.CharSequence cannot be resolved. It is indirectly referenced from required .class files
    交通测速方式
    卡口和电子警察的区别
    Myeclipse连接Mysql数据库时报错:Error while performing database login with the pro driver:unable
    在window上安装mysql
  • 原文地址:https://www.cnblogs.com/xuchunlin/p/5542521.html
Copyright © 2011-2022 走看看