Tornado-0四、Tornado輸出和響應頭

Tornado輸出和響應頭


一、輸出

在上一篇文章0三、Tornado的輸入與輸出 對write有了初步的瞭解
這篇文章咱們先來深刻了解一下write
首先咱們在上一次的tornado文件夾下新建一個lesson3文件夾
實際上,write並無直接把數據返回給前端,而是先寫到緩存區,函數結束以後纔會返回到前端。
咱們驗證以下:
新建start1.py文件 添加完基本的代碼後加入如下代碼前端

class FlushHandler(tornado.web.RequestHandler):
    def get(self):
        self.write('11111111111' + '<br>')
        self.write('22222222222' + '<br>')
        self.write('There comes a flush' + '<br>')
        self.flush()
        import time
        time.sleep(5)
        self.write('33333333333' + '<br>')
        self.write('There no flush' + '<br>')
        self.write('The function is almost over!')

圖片描述

圖片描述

這裏咱們能夠很明顯看到,在有無self.flush()的時候,結果是不同的。若是有的話,就能夠先看到前面的輸出,沒有的話,要等到函數執行完纔可以一塊兒打印出來 。self.flush()就是將當前輸出緩衝區刷新到網頁。web

除了上面的self.flush()以外,還有self.finish()須要咱們注意,它就相似於函數裏面的return,一旦執行,後面就不能再執行self.write,函數原型:segmentfault

RequestHandler.finish(chunk = None)瀏覽器

在finish函數調用完後,調用write函數會報錯緩存

self.finish()
self.write('en~~~~')

報錯內容:RuntimeError: Cannot write() after finish()服務器

將給定的HTTP錯誤發送到瀏覽器app

函數原型:less

RequestHandler.send_error(status_code = 500,**kwargs)

若是flush()已經被調用,則不可能發送錯誤,所以該方法將簡單地終止響應。若是輸出已寫入但還沒有刷新,則將其丟棄並替換爲錯誤頁面。函數

覆蓋write_error()以自定義返回的錯誤頁面。傳遞附加的關鍵字參數
添加下面的Handlertornado

class ErrorHandler(tornado.web.RequestHandler):
    def get(self):
        self.send_error(404)
        # self.flush()
        self.send_error(404)  #若是已經執行 self.flush() 則不會顯示錯誤

圖片描述


覆蓋以實現自定義錯誤頁面

函數原型:

RequestHandler.write_error(status_code** kwargs )

write_error能夠調用write,render,set_header等,以產生輸出。
在ErrorHandler中添加如下代碼

def write_error(self, status_code, **kwargs):  # 重寫write_error方法
    self.write("---%d----\n"%status_code)

圖片描述

經過重寫write_error方法,能夠實現自定義的輸出錯誤。

設置響應的狀態代碼

RequestHandler.set_status(status_code,reason = None)

參數:

  • 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('hujing',18)
        self.set_header('changsha','hunan')

圖片描述

函數原型:

RequestHandler.set_header(name, value)

若是值不是字符串,咱們將其轉換爲字符串。而後將全部標題值編碼爲UTF-8

self.set_header能夠設置本身的須要的響應頭

添加給定的響應頭和值

函數原型:

RequestHandler.add_header(*name*, *value*)

不一樣set_header,add_header可能會屢次調用以返回相同鍵的多個值。相同的鍵set_header只能返回一個值

self.set_header('hujing','20')  #這裏只會顯示hujing:20 覆蓋了前面的hujing:18
self.add_header('hujing','19')  
self.add_header('changsha','0731')  
self.add_header('changsha','0321')

撤消先前的set_header調用

有添加,就會有刪除,函數原型:

RequestHandler.clear_header(name)


self.clear_header('changsha')

3.相應頭的執行順序

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

以上即是是一個響應在後臺的執行順序。能夠根據需求來實現本身須要的內容。

本文章源碼總和

import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
from tornado.options import define, options

define('port', default=9000, help='run port', type=int)


class FlushHandler(tornado.web.RequestHandler):
    def get(self):
        self.write('11111111111' + '<br>')
        self.write('22222222222' + '<br>')
        self.write('There comes a flush' + '<br>')
        self.flush()
        import time
        time.sleep(5)
        self.write('33333333333' + '<br>')
        self.write('There no flush' + '<br>')
        self.write('The function is almost over!')


class ErrorHandler(tornado.web.RequestHandler):
    def get(self):
        self.send_error(404)
        # self.set_status(404, 'error')

    def write_error(self, status_code, **kwargs):  # 重寫write_error方法
        self.write("--%d--\n" % status_code)


class HeadersHandler(tornado.web.RequestHandler):
    def get(self):
        self.write('headers')
        self.set_header('hujing', 18)
        self.set_header('changsha', 'hunan')
        self.set_header('hujing', '20')  # 1
        self.add_header('hujing', '19')  # 2
        self.add_header('changsha', '0731')  # 3
        self.add_header('changsha', '0321')  # 4


if __name__ == '__main__':
    tornado.options.parse_command_line()
    print(options.port)  # 打印端口到terminal
    app = tornado.web.Application(
        handlers=[
            (r'/flush', FlushHandler),
            (r'/error', ErrorHandler),
            (r'/header', HeadersHandler),
        ],
        template_path='templates',

    )
    http_server = tornado.httpserver.HTTPServer(app)
    http_server.listen(options.port)
    tornado.ioloop.IOLoop.instance().start()
相關文章
相關標籤/搜索