如何閱讀Django源代碼-上篇(the5fire版)

在那些優雅、易用、豐富的API背後,總是隱藏著不為人知的密術,好奇的技術人員也總想一探究竟。

由來

所有在用Django的同學都能體會到TA的強大,也能感受到TA的複雜。當能夠通過Django完成簡單或者複雜的業務功能之後,我們不可避免的想要了解TA更多。如何實現url router,如何實現的ORM,如何實現的debug模式的autoreload。技術上最有趣的事兒莫過如此,好奇,你就有機會一探究竟。源碼隨時為你敞開。

在工作的前幾年,我們的小夥伴也產生過這樣的好奇。問出這樣的問題:「如何更好的閱讀Django源碼」。結果是被我們噴回去讀Tornado源碼。相對來說Django的代碼中會充斥大量的業務代碼,就技術氛圍(鬼知道源代碼里能不能讀出技術氛圍~~)而言,Tornado更好一些。But,如果你要長期使用Django還是閱讀Django代碼吧(這是後來我才想明白的事)。研究工具的意義畢竟是更好的解決問題。

前幾天在the5fire博客的也有讀者(@楊學光)問了一樣的問題:如何入手研究Django源碼。所以你看,歲歲年年花相似,年年歲歲人不同。這篇文章就寫寫如何閱讀Django源代碼。

在此之前,建議先閱讀我之前的一篇文章《Python工程師進階之道》,就像我裡面所說的:

好了,the5fire來總結下理論部分:從熟悉的地方中找到陌生的東西,然後搞懂,慢慢往外延伸,可能會比較吃力,但是哪有好走的捷徑?

不知道 @楊學光 同學是否理解了。

如何閱讀Django源代碼

先嘮叨幾句閱讀源碼的方式,其實不止Django源代碼,the5fire個人總結閱源代碼的姿勢也就那麼幾個:

  • 業務需要,遇到坑了,文檔沒找到,只能讀代碼,比如之前the5fire因為一個小問題去翻了一遍nginx的源碼。帶著問題去看,會更認真,收穫的會更多。就像《如何閱讀一本書》裡面提到的一樣。
  • 用著用著就開始好奇Django的CONN_MAX_AGE是怎麼實現的,已經熟悉了各種API介面,所以想一探究竟。
  • 純學習,學了一段時間Python了,想去找個源碼看看,看看自己能不能看懂,還有哪些知識盲點。或者另外一種更高的境界是去學習下優秀框架的設計思想,如何對數據進行封裝,如何使用各種魔法函數。
  • 找工作,簡歷上只寫我熟悉Django和Tornado,顯然不如寫我閱讀了Django和Tornado的源碼,收穫很多,之類的話有吸引力。
  • more and more —— 歡迎補充。

那麼書歸正傳。如果你不熟悉Django,就妄想去讀TA的源代碼的話,那你學習到的只能是一些Python的技巧,比如閉包的使用,各種魔法方法的使用,線程的使用,弱引用的使用等等。對於理解Django是如何支撐起完美主義者的快速開發情節是沒有幫助的。

所以第一步是用TA,先熟悉一塊領域,比如說url router,然後再順藤摸瓜。以此類推,熟悉了Model,Queryset,知道Queryset是惰性的之後,再去看TA是怎麼做到的。繼續摸瓜。

再此之後,去看看Django的文檔,每個模塊或者說每一層都已經劃分的很清晰了,你需要自己把理解的東西對應到具體的那一層上去。比如說你看了Model的Queryset,然後可以對應到Model層;然後你看了Class Base Views部分的封裝邏輯,然後你可以對應到View層,Class Base Views跟Model是怎麼關聯的,這樣就可以連起來。以此類推。最終其實能夠Get到的是,一個請求通過WSGI協議轉到Django中來之後,每一層的處理邏輯是怎麼樣的。

幾個入手點

下篇再寫吧,沒時間了,快上車~~~~~~~~~

----EOF-----

掃碼關注,或者搜索微信公眾號:碼農悟凡

aHR0cDovL3dlaXhpbi5xcS5jb20vci9UblhqX3d2RWdsYjlyVV9ZOXlCYw== (二維碼自動識別)

推薦閱讀:

如何正確的去看源碼 而不心浮氣躁?
高斯過程回歸的matlab代碼調試,不知道怎麼設置參數,沒有出現預期效果?
如何有效率地閱讀源碼以及修改源碼的技巧?
讀源碼要注意哪些方面?有哪些值得推薦的經典源碼?
閱讀django源代碼?

TAG:Django框架 | 源代码 | Web开发框架 |