---恢复内容开始---html
Tornado 中的 get() 或 post() 方法python
Tornado 的 Web 程序会将 URL 或者 URL 范式映射到 tornado.web.RequestHandler
的子类上去。在其子类中定义了get()
或 post()
方法,用以处理不一样的 HTTP 请求。git
下面的代码将 URL 根目录 /
映射到 MainHandler
,还将一个 URL 范式 /story/([0-9]+)
映射到 StoryHandler
。正则表达式匹配的分组会做为参数引入 的相应方法中:github
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
的内容:web
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
异常:app
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
的定义,从而了解到它的 全部属性。tornado
除了 get()
/post()
等之外,RequestHandler
中的一些别的方法函数,这都是 一些空函数,它们存在的目的是在必要时在子类中从新定义其内容。对于一个请求的处理 的代码调用次序以下:post
initialize()
函数,这个函数的参数是 Application
配置中的关键字 参数定义。(initialize
方法是 Tornado 1.1 中新添加的,旧版本中你须要 重写 __init__
以达到一样的目的) initialize
方法通常只是把传入的参数存 到成员变量中,而不会产生一些输出或者调用像 send_error
之类的方法。prepare()
。不管使用了哪一种 HTTP 方法,prepare
都会被调用到,所以 这个方法一般会被定义在一个基类中,而后在子类中重用。prepare能够产生输出 信息。若是它调用了
finish(或
send_error` 等函数),那么整个处理流程 就此结束。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
中的设置)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 时被触发。
---恢复内容结束---