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()
6. write_error()
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()
1 import tornado.web 2 import tornado.ioloop 3 import tornado.options 4 import json 5 6 tornado.options.define('port',type=int,default=8003,help='服务器端口') 7 8 class IndexHandler(tornado.web.RequestHandler): 9 def prepare(self): 10 if self.request.headers.get("Content-Type").startswith("application/json"): 11 self.json_dict=json.loads(self.request.body) 12 else: 13 self.json_dict=None 14 15 def get(self): 16 if self.json_dict: 17 for key,value in self.json_dict.items(): 18 self.write("<h3>%s</h3><p>%s</p>" % (key, value)) 19 else: 20 self.write('hello') 21 22 def post(self): 23 if self.json_dict: 24 for key,value in self.json_dict.items(): 25 self.write("<h3>%s</h3><p>%s</p>" % (key, value)) 26 else: 27 self.write('helloyo') 28 29 if __name__ == '__main__': 30 tornado.options.parse_command_line() 31 app=tornado.web.Application([(r'/',IndexHandler),],debug=True) 32 app.listen(tornado.options.options.port) 33 tornado.ioloop.IOLoop().current().start()


posted on 2020-03-30 21:23 cherry_ning 阅读(431) 评论(0) 收藏 举报
浙公网安备 33010602011771号