(2018-05-26.Python從Zero到One)8、(Tornado)深入tornado__1.3.4 接口與調(diào)用順序

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>

  1. set_defautl_headers()
  2. initialize()
  3. prepare()
  4. HTTP方法
  5. on_finish()

在有錯(cuò)誤拋出時(shí),調(diào)用順序?yàn)椋?/strong>

  1. set_default_headers()
  2. initialize()
  3. prepare()
  4. HTTP方法
  5. set_default_headers()
  6. write_error()
  7. on_finish()
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容