您的位置:首页
Tornado 中的 get() 或 post() 方法
2016-05-30 15:08
549 查看
---恢复内容开始---
Tornado 中的 get() 或 post() 方法
下面的代码将 URL 根目录
你可以使用
上传的文件可以通过
如果你想要返回一个错误信息给客户端,例如“403 unauthorized”,只需要抛出一个
请求处理程序可以通过
你可以通过查看源代码
程序为每一个请求创建一个 RequestHandler 对象
程序调用
程序调用
程序调用某个 HTTP 方法:例如
下面是一个示范
其它设计用来被复写的方法有:
你可以在使用
该参数会激发一个
例如本站的下载 URL,由较短的 URL 重定向到较长的 URL 的方式是这样的:
注意,在
---恢复内容结束---
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-dataPOST 请求上传的文件
path- 请求的路径(
?之前的所有内容)
headers- 请求的开头信息
你可以通过查看源代码
httpserver模组中
HTTPRequest的定义,从而了解到它的 所有属性。
重写 RequestHandler 的方法函数
除了get()/
post()等以外,
RequestHandler中的一些别的方法函数,这都是 一些空函数,它们存在的目的是在必要时在子类中重新定义其内容。对于一个请求的处理 的代码调用次序如下:
程序为每一个请求创建一个 RequestHandler 对象
程序调用
initialize()函数,这个函数的参数是
Application配置中的关键字 参数定义。(
initialize方法是 Tornado 1.1 中新添加的,旧版本中你需要 重写
__init__以达到同样的目的)
initialize方法一般只是把传入的参数存 到成员变量中,而不会产生一些输出或者调用像
send_error之类的方法。
程序调用
prepare()。无论使用了哪种 HTTP 方法,
prepare都会被调用到,因此 这个方法通常会被定义在一个基类中,然后在子类中重用。prepare
可以产生输出 信息。如果它调用了finish
(或send_error` 等函数),那么整个处理流程 就此结束。
程序调用某个 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 PermanentlyHTTP 状态,这在某些情况下是有用的, 例如,你要将页面的原始链接重定向时,这种方式会更有利于搜索引擎优化(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 时被触发。
---恢复内容结束---
相关文章推荐
- WinForm实现简单的拖拽文件到出题的功能(C#)(3)
- 大型网站架构之WEB前端优化
- 第五章 表单
- AndroidSlidingUpPanel简析
- ACM 数据结构-并查集 HDU 1710 Binary Tree Traversals .
- Flume之监控
- Xml PULL解析
- linux脚本Shell之awk详解
- 6_11 四分树(UVa297)<四分树>
- Windows与Linux下文件路径的表示
- 《疯狂Java讲义》——数据类型
- Web页面请求的历程(一)
- 菜单动态选中的样式
- 印度卡纳拉银行四季度3905千万卢比的损失
- Java4Android第0课:java JDK的安装
- 回车与换行的区别
- Mysql之pt-online-schema-change在线更新大表加索引
- rac归档切换测试记录
- Discuz Table ‘common_member_archive’ doesn’t exist
- iOS--应用间跳转