Tornado輸出和響應頭


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>')

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM