tornado学习笔记day04-执行顺序
響應(yīng)輸出 -> write
原型
self.write()函數(shù)
源碼中是這樣定義的
def write(self, chunk: Union[str, bytes, dict]) -> None:作用
將chunk數(shù)據(jù)寫到緩沖區(qū)
刷新緩沖區(qū)的四種方式
- 程序中斷
- 手動(dòng)刷新
- 緩沖區(qū)滿了
- 遇到\n
當(dāng)你寫了一個(gè)print之后,不是直接就顯示在黑屏中斷上面的,而是先到緩沖區(qū)走一個(gè)趟
只是我們python演示不了,這個(gè)得用C語(yǔ)言來(lái)演示,還得是Linux系統(tǒng)才行,兩種條件都不具備
C程序演示
這里我們需要gcc或者g++(編譯C++的)
# include<stdio.h> int main(){while(1){printf("hello");sleep(0.05);}return 0; }基礎(chǔ)
代碼演示
class WriteHandler(RequestHandler):def get(self):self.write("write page info tornado!")self.write("write page nicie tornado!")self.write("write page coll tornado!")self.write("write page beautiful tornado!")'''你會(huì)發(fā)現(xiàn)他們是連著的,因?yàn)槲叶紝懺诹司彌_區(qū)里面'''# 刷新緩沖區(qū), 并關(guān)閉當(dāng)前請(qǐng)求通道self.finish()# 如果我不寫他,當(dāng)我們的程序結(jié)束,他也會(huì)刷新了# 下面這行就寫丟了self.write("write page wonderful tornado!")利用write方法寫JSON數(shù)據(jù)
在Django那時(shí)候是不是有JsonResponse
比如在豆瓣影評(píng)
當(dāng)我們往下滾輪的時(shí)候請(qǐng)求JSON數(shù)據(jù)
在本地通過(guò)創(chuàng)建DOM的方式進(jìn)行加載的
接口調(diào)用順序
方法
initialize()
prepare()
- 作用: 預(yù)處理方法,在執(zhí)行對(duì)應(yīng)的請(qǐng)求方法之前調(diào)用
- 注意:
- 任何一種HTTP請(qǐng)求,都會(huì)執(zhí)行prepare()方法
- 這個(gè)prepare有點(diǎn)想Django里面的中間件,但是中間件能夠在之前或者之后來(lái)執(zhí)行
- 這個(gè)只是在HTTP方法之前執(zhí)行
- 能夠用于一些,比如反爬蟲,我要是不想讓你正常請(qǐng)求,不給你響應(yīng)內(nèi)容,那我這里直接來(lái)個(gè)error直接跳過(guò)write就OK了
- 判斷用戶是否符合規(guī)格
HTTP方法
get(參數(shù)在URL后面)
- 優(yōu)點(diǎn):速度快
- 缺點(diǎn):承載的數(shù)據(jù)量低,安全性相對(duì)低
post(參數(shù)單獨(dú)打包)
- 優(yōu)點(diǎn):速度慢
- 缺點(diǎn):承載的數(shù)據(jù)量高,安全性相對(duì)高了那么一丟丟
- 一般用于修改服務(wù)器上面的數(shù)據(jù),使用post,其他的就用get吧
head
類似get請(qǐng)求,只不過(guò)響應(yīng)中沒(méi)有具體的內(nèi)容,用于獲取報(bào)頭的,一般你不會(huì)用
delete
請(qǐng)求服務(wù)器刪除指定的資源的
put
從客戶端向服務(wù)器傳送指定的內(nèi)容
patch
請(qǐng)求修改局部?jī)?nèi)容
options
返回URL支持所有的HTTP方法
set_default_headers()方法
write_error()方法
on_finish()方法
- 作用:在請(qǐng)求處理結(jié)束后調(diào)用
- 應(yīng)用:
- 我們能在改方法中進(jìn)行一個(gè)資源的清理釋放
- 或者說(shuō)一個(gè)日志的處理
這個(gè)內(nèi)存釋放,我們通常不處理,以為這個(gè)python也有自帶的垃圾回收機(jī)制 - 我們可以對(duì)于數(shù)據(jù)分析的原資料
- 比如對(duì)于訪客的身份統(tǒng)計(jì),喜好判斷,對(duì)于調(diào)整本站的內(nèi)容排行有所參考
- 注意:
- 盡量不要在該方法中進(jìn)行相應(yīng)輸出
- 這里做的是服務(wù)器內(nèi)部的一些處理,不能關(guān)客戶端的事兒
我們可以進(jìn)行打印出來(lái)看一看
class IndexHandler(RequestHandler):def initialize(self) -> None:print("init_initialize")def prepare(self):print("prepare")def get(self):print("get_start")self.write("main page info tornado!")def set_default_headers(self) -> None:print(":set_default_headers")def write_error(self, status_code: int, **kwargs: Any) -> None:print("write_error")def on_finish(self) -> None:print("on_finish")執(zhí)行的結(jié)果順序如下
:set_default_headers init_initialize prepare get_start on_finish另一種方式,帶有錯(cuò)誤的情況
class IndexHandler(RequestHandler):def initialize(self) -> None:print("init_initialize")def prepare(self):print("prepare")def get(self):self.send_error(500)print("get_start")self.write("main page info tornado!")def set_default_headers(self) -> None:print(":set_default_headers")def write_error(self, status_code: int, **kwargs: Any) -> None:print("write_error")self.write("服務(wù)器內(nèi)部錯(cuò)誤!!!")def on_finish(self) -> None:print("on_finish")執(zhí)行的結(jié)果順序如下
:set_default_headers init_initialize prepare :set_default_headers write_error on_finish get_start執(zhí)行的順序總結(jié)
- 在正常情況下,沒(méi)拋出錯(cuò)誤時(shí)
- :set_default_headers:設(shè)置頭
- init_initialize:初始化處理
- prepare:預(yù)處理,預(yù)處理也需要頭,所以在他后面
- get_start:開(kāi)始處理
- on_finish:善后
- 拋出錯(cuò)誤時(shí)
- set_default_headers:
- init_initialize:
- prepare:
- set_default_headers:又重新執(zhí)行了一遍頭,這里
- write_error:
- on_finish:
- get_start:
這個(gè)順序你得記住,其實(shí)也不用,你要是忘了就回來(lái)看就行了,但是你要理解其中的每個(gè)函數(shù)的作用
相似文章
tornado學(xué)習(xí)筆記day01 tornado學(xué)習(xí)筆記day02 tornado學(xué)習(xí)筆記day03 tornado學(xué)習(xí)筆記day04 tornado學(xué)習(xí)筆記day05 tornado學(xué)習(xí)筆記day06 tornado學(xué)習(xí)筆記day07 tornado學(xué)習(xí)筆記day08總結(jié)
以上是生活随笔為你收集整理的tornado学习笔记day04-执行顺序的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: SSH2开发简易的购物网站源代码下载
- 下一篇: 网页视频地址批量抓取工具(原创)