1.輸出
再來看看輸出`write`,實際上,`write`並沒有直接把數據返回給前端,而是先寫到緩存區,函數結束之后才會返回到前端,我們驗證如下
class FlushHandler(tornado.web.RequestHandler): def get(self): self.write('this is '+'<br>') self.write('tornado'+'<br>') self.flush() import time time.sleep(5) self.write('hahaha') self.flush() self.write('en~~~~')
這里我們可以很明顯看到,在有無`self.flush()`的時候,結果是不一樣的。如果有的話,就可以先看到前面的輸出,沒有的話,要等到函數執行完才能夠一起打印出來 。`self.flush()`就是將當前輸出緩沖區刷新到網絡。
除了上面的`self.flush()`之外,還有`self.finish()`需要我們注意,它就類似於函數里面的`return`,一旦執行,后面就不能再執行`self.write`,函數原型:
[`RequestHandler.finish(chunk = None)`](http://www.tornadoweb.org/en/stable/_modules/tornado/web.html#RequestHandler.finish)
在finish函數調用完后,調用write函數會報錯
self.finish() self.write('en~~~~')
**將給定的HTTP錯誤發送到瀏覽器**
[`RequestHandler.send_error(status_code = 500,**kwargs) `](http://www.tornadoweb.org/en/stable/_modules/tornado/web.html#RequestHandler.send_error)
如果[`flush()`](http://www.tornadoweb.org/en/stable/web.html#tornado.web.RequestHandler.flush)已經被調用,則不可能發送錯誤,因此該方法將簡單地終止響應。如果輸出已寫入但尚未刷新,則將其丟棄並替換為錯誤頁面。
覆蓋[`write_error()`](http://www.tornadoweb.org/en/stable/web.html#tornado.web.RequestHandler.write_error)以自定義返回的錯誤頁面。傳遞附加的關鍵字參數
self.send_error(404) #如果已經執行 self.flush() 則不會不能顯示錯誤
**覆蓋以實現自定義錯誤頁面**
函數原型:
[`RequestHandler.write_error(*status_code*,**\* kwargs *)`](http://www.tornadoweb.org/en/stable/_modules/tornado/web.html#RequestHandler.write_error)
`write_error`可以調用[`write`](http://www.tornadoweb.org/en/stable/web.html#tornado.web.RequestHandler.write),[`render`](http://www.tornadoweb.org/en/stable/web.html#tornado.web.RequestHandler.render),[`set_header`](http://www.tornadoweb.org/en/stable/web.html#tornado.web.RequestHandler.set_header)等,以產生輸出。
def write_error(self, status_code, **kwargs): self.write("---%d----\n"%status_code)
通過重寫`write_error`方法,可以實現自定義的輸出錯誤。
**設置響應的狀態代碼**
[`RequestHandler.set_status(status_code,reason = None)`](http://www.tornadoweb.org/en/stable/_modules/tornado/web.html#RequestHandler.set_status)
參數:
\- status_code(int) - 響應狀態碼。
\- reason(string) - 描述狀態代碼的人類可讀原因短語。
self.set_status(404,'error')
2.響應頭的設置
以谷歌瀏覽器為例:按下F12,可以打開瀏覽器自帶的控制台,我們選擇Network,這里我們可以看到瀏覽器在頁面上沒有看到的信息。打開之后刷新一下,選擇之后就可以看到:`General`,`Respnse Headers`和`Request Headers`
`General`:是請求中基本信息,`Respnse Headers`是相應信息,`Request Headers`是請求信息,在服務器端可以設置給瀏覽器的相應信息。
(r'/header',HeadersHandler), class HeadersHandler(tornado.web.RequestHandler): def get(self): self.write('headers') self.set_header('budong',18) self.set_header('changsha','hunan')
函數原型:
[`RequestHandler.set_header(name, value)`](http://www.tornadoweb.org/en/stable/_modules/tornado/web.html#RequestHandler.set_header)
如果值不是字符串,我們將其轉換為字符串。然后將所有標題值編碼為UTF-8
`self.set_header`可以設置自己的需要的響應頭
**添加給定的響應頭和值**
函數原型:
[`RequestHandler.add_header(*name*, *value*)`](http://www.tornadoweb.org/en/stable/_modules/tornado/web.html#RequestHandler.add_header)
不同[`set_header`](http://www.tornadoweb.org/en/stable/web.html#tornado.web.RequestHandler.set_header),[`add_header`](http://www.tornadoweb.org/en/stable/web.html#tornado.web.RequestHandler.add_header)可能會多次調用以返回相同鍵的多個值。相同的鍵`set_header`只能返回一個值
self.set_header('jingqi','20') self.add_header('jingqi','19') self.add_header('jingjing','0731')
**撤消先前的set_header調用**
有添加,就會有刪除,函數原型:
[`RequestHandler.clear_header`(*name*)](http://www.tornadoweb.org/en/stable/_modules/tornado/web.html#RequestHandler.clear_header)
self.clear_header('changsha')
**相應頭的執行順序**
class IndexHandler(tornado.web.RequestHandler): def set_default_headers(self): print(' ---set_default_headers---:設置header'+'<br>') def initialize(self): print(' ---initialize---:初始化'+'<br>') def prepare(self): print(' ---prepare---:准備工作'+'<br>') def get(self): self.write(' ---get---:處理get請求'+'<br>') def post(self): self.write(' ---post---:處理post請求'+'<br>') def write_error(self, status_code, **kwargs): print(' ---write_error---:處理錯誤'+'<br>') def on_finish(self): print(' ---on_finish---:結束,釋放資源'+'<br>')