1 回答

TA貢獻(xiàn)1848條經(jīng)驗(yàn) 獲得超10個(gè)贊
去年做過(guò)一個(gè)不大不小的Flask項(xiàng)目,這邊分享下我的做法:
讀Flask源碼確實(shí)需要讀Werkzeug的源碼,Jinja2的源碼則可以先晾在一邊,原因是在框架結(jié)構(gòu)上Flask與Werkzeug結(jié)合的更緊些,例如我們?cè)谝淮蜨TTP請(qǐng)求上下文中使用的request實(shí)例,就是通過(guò)Werkzeug的LocalProxy包裝實(shí)現(xiàn)的。而Jinja2則完全集中在模板渲染上,如果題主目前的主要任務(wù)是理清“HTTP請(qǐng)求響應(yīng)流”在框架代碼中的走向,那么Jinja2部分可以先作為黑匣子。
怎么切入,我認(rèn)為最好的方法是在您的View Handler中用ipdb下一個(gè)斷點(diǎn),然后啟動(dòng)程序并在瀏覽器中訪問(wèn)該頁(yè)面,當(dāng)運(yùn)行到斷點(diǎn)時(shí),Python進(jìn)程那邊已經(jīng)切換到ipdb的調(diào)試模式,您可以通過(guò)步進(jìn)并隨時(shí)查看當(dāng)前代碼所處的文件、對(duì)應(yīng)行數(shù),以及當(dāng)前的堆棧幀。
第一次用ipdb下斷點(diǎn)查看時(shí),不需要在意當(dāng)前到達(dá)的每一步位置的上下文代碼,只要記住我在哪個(gè)文件的哪個(gè)函數(shù)(方法)中,這樣一遍走下來(lái),您對(duì)一次HTTP請(qǐng)求會(huì)依次經(jīng)歷Flask框架中的哪些部分有個(gè)初步印象。
接下去,就是打開(kāi)這些“框架部分”對(duì)應(yīng)的源碼文件進(jìn)行宏觀閱讀了,這是第二步,如果有經(jīng)驗(yàn),能夠憑直覺(jué)一眼看出(或通過(guò)方法名、或通過(guò)代碼的自文檔化)此處是在做什么。如果第一步用ipdb調(diào)試是在腦海中對(duì)框架打輪廓,那么第二步做完后,已經(jīng)對(duì)這個(gè)框架實(shí)現(xiàn)有較為清晰、整體的認(rèn)識(shí)了。
第三步,根據(jù)第二步所建立的認(rèn)識(shí),繼續(xù)使用ipdb打斷點(diǎn)并調(diào)試,但在這次,需要仔細(xì)地“打量”當(dāng)前上下文,例如上面說(shuō)的查看堆棧幀、或者通過(guò)locals()、globals()查看當(dāng)前名字空間的變化,第三步的作用是為第二步所建立的概念模型進(jìn)行實(shí)踐驗(yàn)證,以加強(qiáng)理解
如此反復(fù)二三兩步,對(duì)框架主要部分實(shí)現(xiàn)的認(rèn)識(shí)則會(huì)愈加清晰,把握住框架主脈絡(luò)后,對(duì)于其他模塊,例如signals、session,則可以逐個(gè)擊破了。
另外,F(xiàn)lask還會(huì)直接依賴(lài)itsdangerous這個(gè)庫(kù),我認(rèn)為也可以了解下。
我現(xiàn)在還在看Flask源碼,原因是它的文檔字符串寫(xiě)得很棒,可以作為我在其他項(xiàng)目使用sphinx-doc組件實(shí)踐時(shí)很好的模板:)。
- 1 回答
- 0 關(guān)注
- 1071 瀏覽
添加回答
舉報(bào)