摘要:就是將當(dāng)前輸出緩沖區(qū)刷新到網(wǎng)頁。如果輸出已寫入但尚未刷新,則將其丟棄并替換為錯(cuò)誤頁面。設(shè)置響應(yīng)的狀態(tài)代碼,參數(shù)響應(yīng)狀態(tài)碼。
Tornado輸出和響應(yīng)頭
在上一篇文章03、Tornado的輸入與輸出 對write有了初步的了解
這篇文章我們先來深入了解一下write
首先我們在上一次的tornado文件夾下新建一個(gè)lesson3文件夾
實(shí)際上,write并沒有直接把數(shù)據(jù)返回給前端,而是先寫到緩存區(qū),函數(shù)結(jié)束之后才會返回到前端。
我們驗(yàn)證如下:
新建start1.py文件 添加完基本的代碼后加入以下代碼
class FlushHandler(tornado.web.RequestHandler): def get(self): self.write("11111111111" + "
") self.write("22222222222" + "
") self.write("There comes a flush" + "
") self.flush() import time time.sleep(5) self.write("33333333333" + "
") self.write("There no flush" + "
") self.write("The function is almost over!")
這里我們可以很明顯看到,在有無self.flush()的時(shí)候,結(jié)果是不一樣的。如果有的話,就可以先看到前面的輸出,沒有的話,要等到函數(shù)執(zhí)行完才能夠一起打印出來 。self.flush()就是將當(dāng)前輸出緩沖區(qū)刷新到網(wǎng)頁。
除了上面的self.flush()之外,還有self.finish()需要我們注意,它就類似于函數(shù)里面的return,一旦執(zhí)行,后面就不能再執(zhí)行self.write,函數(shù)原型:
RequestHandler.finish(chunk = None)
在finish函數(shù)調(diào)用完后,調(diào)用write函數(shù)會報(bào)錯(cuò)
self.finish() self.write("en~~~~")
報(bào)錯(cuò)內(nèi)容:RuntimeError: Cannot write() after finish()
將給定的HTTP錯(cuò)誤發(fā)送到瀏覽器
函數(shù)原型:
RequestHandler.send_error(status_code = 500,**kwargs)
如果flush()已經(jīng)被調(diào)用,則不可能發(fā)送錯(cuò)誤,因此該方法將簡單地終止響應(yīng)。如果輸出已寫入但尚未刷新,則將其丟棄并替換為錯(cuò)誤頁面。
覆蓋write_error()以自定義返回的錯(cuò)誤頁面。傳遞附加的關(guān)鍵字參數(shù)
添加下面的Handler
class ErrorHandler(tornado.web.RequestHandler): def get(self): self.send_error(404) # self.flush() self.send_error(404) #如果已經(jīng)執(zhí)行 self.flush() 則不會顯示錯(cuò)誤
覆蓋以實(shí)現(xiàn)自定義錯(cuò)誤頁面
函數(shù)原型:
RequestHandler.write_error(status_code,** kwargs )
write_error可以調(diào)用write,render,set_header等,以產(chǎn)生輸出。
在ErrorHandler中添加以下代碼
def write_error(self, status_code, **kwargs): # 重寫write_error方法 self.write("---%d---- "%status_code)
通過重寫write_error方法,可以實(shí)現(xiàn)自定義的輸出錯(cuò)誤。
設(shè)置響應(yīng)的狀態(tài)代碼
RequestHandler.set_status(status_code,reason = None)
參數(shù):
status_code(int) - 響應(yīng)狀態(tài)碼。
reason(string) - 描述狀態(tài)代碼的人類可讀原因短語。
self.set_status(404,"error")
2.響應(yīng)頭的設(shè)置以谷歌瀏覽器為例:按下F12,可以打開瀏覽器自帶的控制臺,我們選擇Network,這里我們可以看到瀏覽器在頁面上沒有看到的信息。打開之后刷新一下,選擇之后就可以看到:General,Respnse Headers和Request Headers
General:是請求中基本信息,Respnse Headers是相應(yīng)信息,Request Headers是請求信息,在服務(wù)器端可以設(shè)置給瀏覽器的相應(yīng)信息。
添加以下代碼
(r"/header",HeadersHandler), class HeadersHandler(tornado.web.RequestHandler): def get(self): self.write("headers") self.set_header("hujing",18) self.set_header("changsha","hunan")
函數(shù)原型:
RequestHandler.set_header(name, value)
如果值不是字符串,我們將其轉(zhuǎn)換為字符串。然后將所有標(biāo)題值編碼為UTF-8
self.set_header可以設(shè)置自己的需要的響應(yīng)頭
添加給定的響應(yīng)頭和值
函數(shù)原型:
RequestHandler.add_header(*name*, *value*)
不同set_header,add_header可能會多次調(diào)用以返回相同鍵的多個(gè)值。相同的鍵set_header只能返回一個(gè)值
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調(diào)用
有添加,就會有刪除,函數(shù)原型:
RequestHandler.clear_header(name)
self.clear_header("changsha")
class IndexHandler(tornado.web.RequestHandler): def set_default_headers(self): print(" ---set_default_headers---:設(shè)置header"+"
") def initialize(self): print(" ---initialize---:初始化"+"
") def prepare(self): print(" ---prepare---:準(zhǔn)備工作"+"
") def get(self): self.write(" ---get---:處理get請求"+"
") def post(self): self.write(" ---post---:處理post請求"+"
") def write_error(self, status_code, **kwargs): print(" ---write_error---:處理錯(cuò)誤"+"
") def on_finish(self): print(" ---on_finish---:結(jié)束,釋放資源"+"
")
以上便是是一個(gè)響應(yīng)在后臺的執(zhí)行順序。可以根據(jù)需求來實(shí)現(xiàn)自己需要的內(nèi)容。
本文章源碼總和
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" + "
") self.write("22222222222" + "
") self.write("There comes a flush" + "
") self.flush() import time time.sleep(5) self.write("33333333333" + "
") self.write("There no flush" + "
") 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-- " % 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()
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/44647.html
摘要:譯者說于年月日發(fā)布,該版本正式支持的關(guān)鍵字,并且用舊版本編譯同樣可以使用這兩個(gè)關(guān)鍵字,這無疑是一種進(jìn)步。其次,這是最后一個(gè)支持和的版本了,在后續(xù)的版本了會移除對它們的兼容。本節(jié)最好直接在或者閱讀,以獲得更好的閱讀體驗(yàn)格式支持。 譯者說 Tornado 4.3于2015年11月6日發(fā)布,該版本正式支持Python3.5的async/await關(guān)鍵字,并且用舊版本CPython編譯Torn...
摘要:譯者說于年月日發(fā)布,該版本正式支持的關(guān)鍵字,并且用舊版本編譯同樣可以使用這兩個(gè)關(guān)鍵字,這無疑是一種進(jìn)步。其次,這是最后一個(gè)支持和的版本了,在后續(xù)的版本了會移除對它們的兼容。 譯者說 Tornado 4.3于2015年11月6日發(fā)布,該版本正式支持Python3.5的async/await關(guān)鍵字,并且用舊版本CPython編譯Tornado同樣可以使用這兩個(gè)關(guān)鍵字,這無疑是一種進(jìn)步。其次...
閱讀 3503·2021-11-24 09:39
閱讀 781·2019-08-30 14:22
閱讀 3031·2019-08-30 13:13
閱讀 2310·2019-08-29 17:06
閱讀 2918·2019-08-29 16:22
閱讀 1255·2019-08-29 10:58
閱讀 2427·2019-08-26 13:47
閱讀 1628·2019-08-26 11:39