引言
今天發現一個很詭異的問題,在django項目視圖函數中,使用print,結果打印不出來。由於項目寫了很久,查了很久的,最終還是找到根本原因了。有時候BUG就是在那個毫不起眼的角落里藏着!
問題
從上圖看視圖函數請求是成功的,並沒有什么毛病,但是百思不得其解,為啥會這樣?
然后加一下日志再看看:
日志可以正常顯示,但是打印始終無法顯示。
踩過的坑
而我換個項目,我其他的項目,嘗試打印,是正常的。唯獨這個項目不行,但是項目運行是正常的,前端操作后端返回的數據也正常。就在這一切看似正常的情況下,這個打印始終不顯示,不僅僅是這個視圖函數,我里面所有視圖函數加了個打印功能都不顯示。后面在一位大神的指點下,嘗試了新建項目,重新弄一次,還是不行。最后只有一步一步注釋的去找原因。結果最終還是找到原因。
解決
根本原因是我封裝了某模塊,模塊里面寫了兩行代碼引起的。
import io import sys sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf-8')
嘗試這注釋后,結果就打印出來。
這是為啥呢? 這兩個代碼其實是改變輸出方式,當我們需要打印一些字符時,並不是立刻就打印,而是先將需要打印的字符放入緩沖區,在緩沖區刷新時打印,當緩沖區未滿,或者程序運行未結束時,可使用sys.stdout.flush()強制刷新緩沖區,立刻進行打印。
總結
這個坑我躺了差不多6個小時,有時候自己寫代碼的時候,一定要謹慎,並且備注一定要有,不然過了很長一段時間,你再來維護代碼,你發現了bug,如果是一些奇葩的,會消耗你很多時間。雖然這看似是個小問題,但是耗了我太長時間,所以記錄一下,希望能給遇到同樣問題的小伙伴帶來幫助。
如果對python測試開發相關技術感興趣的伙伴,歡迎加入測試開發學習交流QQ群:696400122,不積跬步,無以至千里。