響應輸出 -> write
原型
self.write()函數
源碼中是這樣定義的
def write(self, chunk: Union[str, bytes, dict]) -> None:
作用
將chunk數據寫到緩沖區
刷新緩沖區的四種方式
- 程序中斷
- 手動刷新
- 緩沖區滿了
- 遇到\n
當你寫了一個print之后,不是直接就顯示在黑屏中斷上面的,而是先到緩沖區走一個趟
只是我們python演示不了,這個得用C語言來演示,還得是Linux系統才行,兩種條件都不具備
C程序演示
這里我們需要gcc或者g++(編譯C++的)
# include<stdio.h>
int main(){while(1){printf("hello");sleep(0.05);}return 0;
}
基礎
代碼演示
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!")'''你會發現他們是連著的,因為我都寫在了緩沖區里面'''# 刷新緩沖區, 并關閉當前請求通道self.finish()# 如果我不寫他,當我們的程序結束,他也會刷新了# 下面這行就寫丟了self.write("write page wonderful tornado!")
利用write方法寫JSON數據
在Django那時候是不是有JsonResponse
比如在豆瓣影評
當我們往下滾輪的時候請求JSON數據
在本地通過創建DOM的方式進行加載的
接口調用順序
方法
initialize()
prepare()
- 作用: 預處理方法,在執行對應的請求方法之前調用
- 注意:
- 任何一種HTTP請求,都會執行prepare()方法
- 這個prepare有點想Django里面的中間件,但是中間件能夠在之前或者之后來執行
- 這個只是在HTTP方法之前執行
- 能夠用于一些,比如反爬蟲,我要是不想讓你正常請求,不給你響應內容,那我這里直接來個error直接跳過write就OK了
- 判斷用戶是否符合規格
HTTP方法
get(參數在URL后面)
- 優點:速度快
- 缺點:承載的數據量低,安全性相對低
post(參數單獨打包)
- 優點:速度慢
- 缺點:承載的數據量高,安全性相對高了那么一丟丟
- 一般用于修改服務器上面的數據,使用post,其他的就用get吧
head
類似get請求,只不過響應中沒有具體的內容,用于獲取報頭的,一般你不會用
delete
請求服務器刪除指定的資源的
put
從客戶端向服務器傳送指定的內容
patch
請求修改局部內容
options
返回URL支持所有的HTTP方法
set_default_headers()方法
write_error()方法
on_finish()方法
- 作用:在請求處理結束后調用
- 應用:
- 我們能在改方法中進行一個資源的清理釋放
- 或者說一個日志的處理
這個內存釋放,我們通常不處理,以為這個python也有自帶的垃圾回收機制 - 我們可以對于數據分析的原資料
- 比如對于訪客的身份統計,喜好判斷,對于調整本站的內容排行有所參考
- 注意:
- 盡量不要在該方法中進行相應輸出
- 這里做的是服務器內部的一些處理,不能關客戶端的事兒
我們可以進行打印出來看一看
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")
執行的結果順序如下
:set_default_headers
init_initialize
prepare
get_start
on_finish
另一種方式,帶有錯誤的情況
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("服務器內部錯誤!!!")def on_finish(self) -> None:print("on_finish")
執行的結果順序如下
:set_default_headers
init_initialize
prepare
:set_default_headers
write_error
on_finish
get_start
執行的順序總結
- 在正常情況下,沒拋出錯誤時
- :set_default_headers:設置頭
- init_initialize:初始化處理
- prepare:預處理,預處理也需要頭,所以在他后面
- get_start:開始處理
- on_finish:善后
- 拋出錯誤時
- set_default_headers:
- init_initialize:
- prepare:
- set_default_headers:又重新執行了一遍頭,這里
- write_error:
- on_finish:
- get_start:
這個順序你得記住,其實也不用,你要是忘了就回來看就行了,但是你要理解其中的每個函數的作用
相似文章
tornado學習筆記day01
tornado學習筆記day02
tornado學習筆記day03
tornado學習筆記day04
tornado學習筆記day05
tornado學習筆記day06
tornado學習筆記day07
tornado學習筆記day08