亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何閱讀Flask源碼?

如何閱讀Flask源碼?

qq_笑_17 2018-10-14 13:33:39
最近打算閱讀一下Flask的源碼,由于自己前讀的一些代碼,常是一些某個庫的使用方法的代碼,比如urllib2該如何使用等。而對于像框架之類的代碼沒有閱讀過,嘗試去讀的時候,發現無從下手:不知道從哪個文件開始讀對于某個模塊,到底怎么個用法,不清楚該如何測試另外,由于是Flask就是Werkzeug+Jinja2而成的,是不是有必要先從后兩個開始閱讀呢?麻煩大家分享下你閱讀代碼的方法,是從哪里入手的,如何理解某個模塊是如何實現的?
查看完整描述

1 回答

?
慕桂英546537

TA貢獻1848條經驗 獲得超10個贊

去年做過一個不大不小的Flask項目,這邊分享下我的做法:

讀Flask源碼確實需要讀Werkzeug的源碼,Jinja2的源碼則可以先晾在一邊,原因是在框架結構上Flask與Werkzeug結合的更緊些,例如我們在一次HTTP請求上下文中使用的request實例,就是通過Werkzeug的LocalProxy包裝實現的。而Jinja2則完全集中在模板渲染上,如果題主目前的主要任務是理清“HTTP請求響應流”在框架代碼中的走向,那么Jinja2部分可以先作為黑匣子。

怎么切入,我認為最好的方法是在您的View Handler中用ipdb下一個斷點,然后啟動程序并在瀏覽器中訪問該頁面,當運行到斷點時,Python進程那邊已經切換到ipdb的調試模式,您可以通過步進并隨時查看當前代碼所處的文件、對應行數,以及當前的堆棧幀。

第一次用ipdb下斷點查看時,不需要在意當前到達的每一步位置的上下文代碼,只要記住我在哪個文件的哪個函數(方法)中,這樣一遍走下來,您對一次HTTP請求會依次經歷Flask框架中的哪些部分有個初步印象。

接下去,就是打開這些“框架部分”對應的源碼文件進行宏觀閱讀了,這是第二步,如果有經驗,能夠憑直覺一眼看出(或通過方法名、或通過代碼的自文檔化)此處是在做什么。如果第一步用ipdb調試是在腦海中對框架打輪廓,那么第二步做完后,已經對這個框架實現有較為清晰、整體的認識了。

第三步,根據第二步所建立的認識,繼續使用ipdb打斷點并調試,但在這次,需要仔細地“打量”當前上下文,例如上面說的查看堆棧幀、或者通過locals()、globals()查看當前名字空間的變化,第三步的作用是為第二步所建立的概念模型進行實踐驗證,以加強理解

如此反復二三兩步,對框架主要部分實現的認識則會愈加清晰,把握住框架主脈絡后,對于其他模塊,例如signals、session,則可以逐個擊破了。

另外,Flask還會直接依賴itsdangerous這個庫,我認為也可以了解下。

我現在還在看Flask源碼,原因是它的文檔字符串寫得很棒,可以作為我在其他項目使用sphinx-doc組件實踐時很好的模板:)。


查看完整回答
反對 回復 2018-10-21
  • 1 回答
  • 0 關注
  • 1072 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號