3.4 接口與調(diào)用順序
下面的接口方法是由tornado框架進(jìn)行調(diào)用的,我們可以選擇性的重寫這些方法。
1. initialize()
對(duì)應(yīng)每個(gè)請(qǐng)求的處理類Handler在構(gòu)造一個(gè)實(shí)例后首先執(zhí)行initialize()方法。在講輸入時(shí)提到,路由映射中的第三個(gè)字典型參數(shù)會(huì)作為該方法的命名參數(shù)傳遞,如:
class ProfileHandler(RequestHandler):
def initialize(self, database):
self.database = database
def get(self):
...
app = Application([
(r'/user/(.*)', ProfileHandler, dict(database=database)),
])
此方法通常用來(lái)初始化參數(shù)(對(duì)象屬性),很少使用。
2. prepare()
預(yù)處理,即在執(zhí)行對(duì)應(yīng)請(qǐng)求方式的HTTP方法(如get、post等)前先執(zhí)行,注意:不論以何種HTTP方式請(qǐng)求,都會(huì)執(zhí)行prepare()方法。
以預(yù)處理請(qǐng)求體中的json數(shù)據(jù)為例:
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方式發(fā)送json數(shù)據(jù)時(shí):

day60_tornado-深入tornado-01.png
用put方式發(fā)送json數(shù)據(jù)時(shí):

day60_tornado-深入tornado-02.png
3. HTTP方法
| 方法 | 描述 |
|---|---|
| get | 請(qǐng)求指定的頁(yè)面信息,并返回實(shí)體主體。 |
| head | 類似于get請(qǐng)求,只不過返回的響應(yīng)中沒有具體的內(nèi)容,用于獲取報(bào)頭 |
| post | 向指定資源提交數(shù)據(jù)進(jìn)行處理請(qǐng)求(例如提交表單或者上傳文件)。數(shù)據(jù)被包含在請(qǐng)求體中。POST請(qǐng)求可能會(huì)導(dǎo)致新的資源的建立和/或已有資源的修改。 |
| delete | 請(qǐng)求服務(wù)器刪除指定的內(nèi)容。 |
| patch | 請(qǐng)求修改局部數(shù)據(jù)。 |
| put | 從客戶端向服務(wù)器傳送的數(shù)據(jù)取代指定的文檔的內(nèi)容。 |
| options | 返回給定URL支持的所有HTTP方法。 |
4. on_finish()
在請(qǐng)求處理結(jié)束后調(diào)用,即在調(diào)用HTTP方法后調(diào)用。通常該方法用來(lái)進(jìn)行資源清理釋放或處理日志等。注意:請(qǐng)盡量不要在此方法中進(jìn)行響應(yīng)輸出。
5. set_default_headers()
6. write_error()
7. 調(diào)用順序
我們通過一段程序來(lái)看上面這些接口的調(diào)用順序。
class IndexHandler(RequestHandler):
def initialize(self):
print "調(diào)用了initialize()"
def prepare(self):
print "調(diào)用了prepare()"
def set_default_headers(self):
print "調(diào)用了set_default_headers()"
def write_error(self, status_code, **kwargs):
print "調(diào)用了write_error()"
def get(self):
print "調(diào)用了get()"
def post(self):
print "調(diào)用了post()"
self.send_error(200) # 注意此出拋出了錯(cuò)誤
def on_finish(self):
print "調(diào)用了on_finish()"

day60_tornado-深入tornado-03.png
在正常情況未拋出錯(cuò)誤時(shí),調(diào)用順序?yàn)椋?/strong>
- set_defautl_headers()
- initialize()
- prepare()
- HTTP方法
- on_finish()
在有錯(cuò)誤拋出時(shí),調(diào)用順序?yàn)椋?/strong>
- set_default_headers()
- initialize()
- prepare()
- HTTP方法
- set_default_headers()
- write_error()
- on_finish()