Tornado接口与调用的顺序 ***
下面的接口方法是由tornado框架进行调用的,我们可以选择性的重写这些方法。
1. initialize()
对应每个请求的处理类Handler在构造一个实例后首先执行initialize()方法。在讲输入时提到,路由映射中的第三个字典型参数会作为该方法的命名参数传递,如:
class ProfileHandler(RequestHandler): def initialize(self, database): self.database = database def get(self): ... app = Application([ (r'/user/(.*)', ProfileHandler, dict(database=database)), ])
此方法通常用来初始化参数(对象属性),很少使用。
2. prepare()
预处理,即在执行对应请求方式的HTTP方法(如get、post等)前先执行,注意:不论以何种HTTP方式请求,都会执行prepare()方法。
以预处理请求体中的json数据为例:
import json class IndexHandler(RequestHandler): def prepare(self): if self.request.headers.get("Content-Type").startswith("application/json"): self.json_dict = json.loads(self.request.body) else: self.json_dict = None def post(self): if self.json_dict: for key, value in self.json_dict.items(): self.write("<h3>%s</h3><p>%s</p>" % (key, value)) def put(self): if self.json_dict: for key, value in self.json_dict.items(): self.write("<h3>%s</h3><p>%s</p>" % (key, value))
用post方式发送json数据时:
用put方式发送json数据时:
3. HTTP方法
方法 | 描述 |
---|---|
get | 请求指定的页面信息,并返回实体主体。 |
head | 类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头 |
post | 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。 |
delete | 请求服务器删除指定的内容。 |
patch | 请求修改局部数据。 |
put | 从客户端向服务器传送的数据取代指定的文档的内容。 |
options | 返回给定URL支持的所有HTTP方法。 |
4. on_finish()
在请求处理结束后调用,即在调用HTTP方法后调用。通常该方法用来进行资源清理释放或处理日志等。注意:请尽量不要在此方法中进行响应输出。
5. set_default_headers()
详见上篇博客:https://www.cnblogs.com/paulwhw/articles/12047655.html#_label4
6. write_error()
详见上篇博客:https://www.cnblogs.com/paulwhw/articles/12047655.html#_label4
7. 接口的调用顺序 *****
我们通过一段程序来看上面这些接口的调用顺序。
class IndexHandler(RequestHandler): def initialize(self): print "调用了initialize()" def prepare(self): print "调用了prepare()" def set_default_headers(self): print "调用了set_default_headers()" def write_error(self, status_code, **kwargs): print "调用了write_error()" def get(self): print "调用了get()" def post(self): print "调用了post()" self.send_error(200) # 注意此出抛出了错误 def on_finish(self): print "调用了on_finish()"
在正常情况未抛出错误时,调用顺序为:
- set_defautl_headers()
- initialize()
- prepare()
- HTTP方法
- on_finish()
在有错误抛出时,调用顺序为:
- set_default_headers()
- initialize()
- prepare()
- HTTP方法
- set_default_headers()
- write_error()
- on_finish()