1.輸出html
再來看看輸出`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()`就是將當前輸出緩衝區刷新到網絡。web
除了上面的`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)已經被調用,則不可能發送錯誤,所以該方法將簡單地終止響應。若是輸出已寫入但還沒有刷新,則將其丟棄並替換爲錯誤頁面。tornado
覆蓋[`write_error()`](http://www.tornadoweb.org/en/stable/web.html#tornado.web.RequestHandler.write_error)以自定義返回的錯誤頁面。傳遞附加的關鍵字參數post
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>')