全書共分為8 章,分別是Django 源碼的前置知識、 Django 命令原理解析、Django 內置的ORM框架、Django 內置的模板系統(tǒng)、解讀Django 核心模塊的源碼、Django 的視圖層、Django 的中間件原理和解讀Django 中的輔助代碼。本書展示了剖析Django 框架的完整過程,這種剖析方式同樣適用于其他框架,如Flask、Ansible 和Scrapy 等。
Django 是Python 在Web 框架中的代表作品。學習Django源碼,一方面,能從中學到許多Python 的高級用法;另一方面,能深度掌握Django 框架,并能隨時對其進行定制和改造,這對一個Python 程序員的成長至關重要。
另外,Django 源碼十分適合初學者學習,不僅調試方便,而且可以隨時打印結果進行驗證。以Django 源碼為入口切入開源世界,對Python 愛好者而言,再合適不過了。
前言
隨著深度學習的流行,Python 逐漸走到了互聯(lián)網的幕前,它在多個領域使用廣泛:機器學習、數據分析、Web 服務、自動化運維,等等。Django 是Python 在Web 框架中的代表作品。學習Django源碼,一方面,能從中學到許多Python 的高級用法;另一方面,能深度掌握Django 框架,并能隨時對其進行定制和改造,這對一個Python 程序員的成長至關重要。此外,在Django 源碼中,很多函數與類均可在簡單改造后直接加入開發(fā)人員手頭的代碼庫中。
撰寫本書的主要原因有兩個:一是想將筆者剖析Django 源碼的過程記錄下來,二是想給一些Django 初學者開啟一個新的進階方向。
Django 源碼十分適合初學者學習,因為Python 源碼與C 源碼相比難度要低許多,而且調試方便,讀者可以隨時打印結果進行驗證。以Django 源碼為入口切入開源世界,對Python 愛好者而言,再合適不過了。
本書特色
本書的主要特色有:
◎ 對Django 的源碼進行了合理選擇,并不會盲目追求與小版本,而是從適合的角度進行考慮。
◎ 對Django 的源碼進行了合理歸類與總結,并按照歸類結果依次解讀相關源碼,循序漸進。
◎ 有對Django 源碼細節(jié)的豐富解讀,直接使用實戰(zhàn)的方式幫助讀者理解相關類與方法。
◎ 對Django 源碼的解讀均采用先上手并提問的方式,然后會帶著問題去跟蹤源碼,后閱讀完相關模塊源碼后會統(tǒng)一對前面提出的問題進行解答。這很符合初學者的閱讀習慣,使得閱讀本書十分順暢。
本書內容
全書共分為8 章,分別是Django 源碼的前置知識、 Django 命令原理解析、Django 內置的ORM框架、Django 內置的模板系統(tǒng)、解讀Django 核心模塊的源碼、Django 的視圖層、Django 的中間件原理和解讀Django 中的輔助代碼。本書展示了剖析Django 框架的完整過程,這種剖析方式同樣適用于其他框架,如Flask、Ansible 和Scrapy 等。
本書對Django 源碼進行了全面解讀,針對很多源碼細節(jié)使用了大量的演示實例,以便讀者更好地理解Django 框架的核心源碼。本書給讀者提供了一個解讀完整開源項目的案例,讀者在學完本書后,可以將本書剖析Django 源碼的方式應用于其他Python 開源項目,收獲良好的學習效果。
本書的思維導圖如下所示。
讀者對象
想要學習本書的內容,領會其中的分析思路,讀者需要具備一定的Python 基礎,同時要有堅持學習的信念,本書適合以下讀者閱讀:
◎ 具有一定Python 基礎的開發(fā)人員;
◎ 希望熟練使用Django 框架進行Web 開發(fā),而且想深入了解Django 核心源碼的后端開發(fā)人員;
◎ 渴望進入開源世界,探索一個開源項目全貌的初、中級程序員;
◎ 高等院校的老師和學生;
◎ 相關培訓機構的學員。
配書資源獲取方式
本書涉及的源碼需要讀者自行下載。在博文視點網站(http://www.broadview.com.cn/)搜索本書,單擊進入本書頁面,即可在本書頁面上找到下載鏈接。此外,可以通過微信搜索源碼探索之旅公眾號并關注,筆者會在上面對讀者的一些疑惑進行文字或視頻解答。
致謝一
在本書的寫作過程中,我充滿著感激之情。
感謝我的家人!感謝父母和姐姐給我的鼓勵與支持,沒有他們就沒有我的今天,我也不會有機會接觸計算機行業(yè)。
感謝我的女朋友黃寶寶,她花費了休息時間幫我修改書稿中的不當語句和錯別字,給予我充分的時間專注于核心內容。
感謝天翼云科技有限公司的領導黃潤懷和我的直接上級領導林潔琬組長,他們給我們組創(chuàng)造了一個難得的機會,讓我們能全身心地投入分布式存儲領域中。正是這次機會,讓我在自動化運維領域自由探索。由于工作的需要,我接觸了許多基于Python 開發(fā)的開源項目,也逐漸愛上探索開源工具內部的源碼。
感謝同一屆進入公司的同事:商金輝、李浩、全樹強和張一飛,每天吃完晚飯在路上胡吹海侃的日子,真是令人懷戀!
感謝媒體存儲小分隊的黃鵠、陳濤、毛廷鴻、譚偉杰、吳文峰、楊佑,他們豐富的互聯(lián)網經驗給了我很多幫助,也讓本書的寫作比預期順利很多。
感謝本書的編輯安娜,她的耐心和細心促成了本書的快速交付;還要感謝其他為本書的出版提供過幫助的編輯和朋友!沒有他們的大力支持,本書也很難與讀者見面。
沈 聰
致謝二
我們能順利完成本書既離不開自己的付出和努力,也離不開家人和同事們的大力支持。他們的支持讓我在編寫本書的道路上走得更加順利,我要向他們表示真摯的謝意。
首先,感謝我的妻子對我的關心和支持。在技術探索和創(chuàng)作的歷程中,她的關心讓我充滿了前進的動力,這也讓我能夠走得更遠。
其次,感謝本書的合著者沈聰先生。他喜好鉆研,技術能力強,我們在工作中多次合作交流,讓我受益匪淺。本書的創(chuàng)作也凝聚了他的心血和精力。
后,感謝我的領導林潔琬組長和其他同事。在林潔琬組長的帶領下,我們項目組的業(yè)務和技術都突飛猛進,也讓我有了更多的機會對Django 框架進行實踐和探索。項目組的資深運維工程師陳濤、毛廷鴻、譚偉杰、楊佑等對我們基于Django 框架的項目開發(fā)提供了寶貴的建議和技術支持。
全樹強
技術支持
Django 項目如今依舊頻繁迭代著,在本書正式出版時,書中介紹的Django 版本距離版本可能會有較大差距。盡管版本可能差距較大,但筆者發(fā)現(xiàn)Django 的核心源碼及相關邏輯一直未有大的改變,讀者可以放心閱讀。筆者完成本書所需的主要素材只有Django 源碼,許多Django 術語(比如核心模塊、中間件等)都是直接翻譯英文注釋而來,可能會有不當之處,加之筆者水平和精力所限,書中可能存在一些疏漏與錯誤,敬請各位前輩、同行、讀者不吝指正。如果在閱讀本書時有疑問,可以發(fā)送電子郵件到2894577759@qq.com,筆者當盡力解答相關疑問,與讀者共同成長與進步。
沈聰,本科畢業(yè)于南昌大學,碩士畢業(yè)于武漢大學電子信息學院,畢業(yè)后進入天翼云科技有限公司,目前在天翼云媒體存儲小組從事大規(guī)模集群部署、運維平臺開發(fā)及集群日常運維、巡檢等工作。擁有多年運維開發(fā)經驗,目前專注于Python自動化運維、云存儲等方向,研究過數個熱門Pyth框架源碼,如Ansible、Django、Scrapy,在慕課網上發(fā)表了多個基礎教程,內容涉及Nginx入門、Python算法、Django框架及Scrapy框架,并出版了《吃透Ansible:核心源碼剖析與項目實戰(zhàn)》一書。
全樹強,本科和碩士皆畢業(yè)于武漢大學電子信息學院,畢業(yè)后進入天翼云科技有限公司,目前在天翼云媒體存儲小組負責媒體存儲小組內部的統(tǒng)一運維管理平臺研發(fā)工作,對Django框架源碼有較為深入的研究,并且在Java后端和前端、以及自動化運維領域做過大量開發(fā)工作,有豐富的運維和開發(fā)經驗,是一位全棧工程師。
第1 章 Django 源碼的前置知識 ............................................................................................... 1
1.1 在學習Django 源碼前,該做什么 ............................................................................. 1
1.1.1 Django 的版本選擇 ...................................................................................... 1
1.1.2 Django 源碼學習基礎 .................................................................................. 2
1.2 搭建Django 的調試環(huán)境和測試環(huán)境 .......................................................................... 3
1.2.1 調試django-admin 命令 .................................................................................. 3
1.2.2 調試manage.py 命令 ....................................................................................... 8
1.2.3 調試框架源碼 ................................................................................................. 11
1.2.4 搭建Django 的測試環(huán)境 ............................................................................... 15
1.3 學習Django 源碼的建議 ........................................................................................... 17
1.4 小結 ............................................................................................................................. 18
第2 章 Django 命令原理解析 ...................................................................................... 19
2.1 基礎方法介紹 ............................................................................................................. 19
2.1.1 find_commands()函數 .................................................................................... 19
2.1.2 load_command_class()函數 ............................................................................ 20
2.1.3 get_commands()函數 ...................................................................................... 20
2.1.4 call_command()函數 ...................................................................................... 21
2.2 startproject 命令的實現(xiàn)原理 ...................................................................................... 24
2.3 shell 命令的實現(xiàn)原理 ................................................................................................. 33
2.4 makemigrations 命令的實現(xiàn)原理 .............................................................................. 45
2.4.1 makemigrations 命令的基本操作示例 ........................................................ 45
2.4.2 遷移相關的基礎類與方法 ......................................................................... 47
2.4.3 追蹤makemigrations 命令 .......................................................................... 69
2.5 migrate 命令的實現(xiàn)原理 ............................................................................................ 78
2.6 小結 ............................................................................................................................. 90
第3 章 Django 內置的ORM 框架 ................................................................................ 91
3.1 讀取Django 項目的配置信息 ................................................................................... 91
3.1.1 Settings 類 .................................................................................................. 92
3.1.2 LazySettings 類 ........................................................................................... 94
3.2 ORM 框架的底層核心 ............................................................................................... 97
3.2.1 mysqlclient 模塊中的常用方法 .................................................................. 97
3.2.2 ORM 框架的源碼解析 ............................................................................... 98
3.2.3 DatabaseWrapper 類的實戰(zhàn)案例 .............................................................. 108
3.3 Django 中數據庫操作背后的原理........................................................................... 116
3.3.1 在Django 中執(zhí)行原生SQL 語句 ............................................................. 117
3.3.2 ORM 框架的基本操作 ............................................................................. 118
3.3.3 答疑解惑 .................................................................................................. 160
3.3.4 ORM 框架的聚合操作 ............................................................................. 162
3.4 ORM 框架的部分源碼解讀 ..................................................................................... 176
3.5 小結 ........................................................................................................................... 205
第4 章 Django 內置的模板系統(tǒng) ................................................................................. 206
4.1 Django 內置的模板語法 .......................................................................................... 206
4.1.1 for 標簽 .................................................................................................... 207
4.1.2 if 標簽 ...................................................................................................... 211
4.1.3 csrf_token 標簽 ......................................................................................... 212
4.1.4 with 標簽 .................................................................................................. 212
4.1.5 cycle 標簽 ................................................................................................. 213
4.1.6 include 標簽 ............................................................................................. 214
4.1.7 過濾器標簽 .............................................................................................. 215
4.2 Django 內置模板引擎源碼解讀 .............................................................................. 216
4.2.1 get_template()方法的源碼解析 ................................................................ 216
4.2.2 _engine_list()方法的源碼解析.................................................................. 216
4.2.3 EngineHandler 類的源碼解析 .................................................................. 217
4.2.4 DjangoTemplates 類的源碼解析 ............................................................... 221
4.3 答疑解惑 ................................................................................................................... 283
4.4 Jinja2 模塊封裝過程解析 ......................................................................................... 299
4.5 小結 ........................................................................................................................... 303
第5 章 解讀Django 核心模塊的源碼 ........................................................................ 304
5.1 core 目錄源碼一覽 ................................................................................................... 304
5.2 請求處理 ................................................................................................................... 305
5.3 緩存模塊 ................................................................................................................... 316
5.4 檢查模塊 ................................................................................................................... 330
5.4.1 messages.py 文件的源碼解析 ................................................................... 330
5.4.2 registry.py 文件的源碼解析 ...................................................................... 333
5.5 序列化 ....................................................................................................................... 348
5.5.1 serialize()方法的源碼解析 ....................................................................... 349
5.5.2 JSON 序列化器的底層邏輯 ..................................................................... 359
5.5.3 簡單分析Python 序列化器的輸出結果 ................................................... 366
5.6 文件模塊 ................................................................................................................... 367
5.6.1 uploadedfile.py 文件 ................................................................................. 367
5.6.2 images.py 文件 ......................................................................................... 374
5.6.3 locks.py 文件 ............................................................................................ 376
5.6.4 temp.py 文件 ............................................................................................ 378
5.6.5 move.py 文件 ........................................................................................... 379
5.6.6 storage.py 文件 ......................................................................................... 381
5.6.7 uploadhandler.py 文件 .............................................................................. 384
5.7 發(fā)送郵件 ................................................................................................................... 393
5.8 小結 ........................................................................................................................... 405
第6 章 Django 的視圖層 ........................................................................................... 406
6.1 視圖層實戰(zhàn) ............................................................................................................... 406
6.1.1 實驗1:Django 中的hello, world ....................................................... 406
6.1.2 實驗2:Django 中的視圖類 .................................................................... 409
6.1.3 實驗3:Django 中的請求傳參 ................................................................ 410
6.1.4 實驗4:Django 中的文件上傳演示 ........................................................ 414
6.1.5 實驗5:在Django 中操作Session .......................................................... 417
6.2 請求與響應 ............................................................................................................... 419
6.2.1 HttpRequest 類的源碼 .............................................................................. 429
6.2.2 HttpResponse 類的源碼 ............................................................................ 433
6.2.3 HttpRequest 類和HttpResponseBase 類的操作示例 ................................ 440
6.3 視圖層核心源碼解讀 ............................................................................................... 444
6.3.1 HTTP 請求路徑的匹配過程 ..................................................................... 449
6.3.2 答疑解惑 .................................................................................................. 457
6.4 視圖類與Mixin 類 ................................................................................................... 462
6.4.1 Mixin 類的源碼解析 ................................................................................ 462
6.4.2 TemplateView 類的源碼解析 ................................................................... 463
6.4.3 RedirectView 類的源碼解析 ..................................................................... 467
6.4.4 DetailView 類和ListView 類的源碼解析 ................................................. 469
6.4.5 MultipleObjectMixin 類的源碼解析 ......................................................... 479
6.4.6 Paginator 類的源碼解析 ........................................................................... 482
6.5 追蹤Session 相關的源碼 ......................................................................................... 486
6.5.1 Session 相關的配置 .................................................................................. 486
6.5.2 Session 的存儲引擎 .................................................................................. 495
6.5.3 SessionBase 類中的代碼文件 ................................................................... 502
6.6 答疑解惑 ................................................................................................................... 507
6.7 小結 ........................................................................................................................... 517
第7 章 Django 的中間件原理 .................................................................................... 518
7.1 配置中間件 ............................................................................................................... 518
7.2 加載中間件 ............................................................................................................... 519
7.3 中間件的處理流程 ................................................................................................... 521
7.3.1 中間件的請求處理流程 ........................................................................... 521
7.3.2 中間件的響應處理流程 ........................................................................... 525
7.3.3 中間件的其他鉤子方法 ........................................................................... 526
7.4 常用的中間件 ........................................................................................................... 528
7.4.1 Django 內置的中間件類 .......................................................................... 528
7.4.2 CsrfViewMiddleware 中間件 .................................................................... 529
7.5 自定義中間件 ........................................................................................................... 536
7.6 小結 ........................................................................................................................... 541
第8 章 解讀Django 中的輔助代碼 ............................................................................ 542
8.1 自動重載 ................................................................................................................... 542
8.2 日志配置 ................................................................................................................... 552
8.2.1 日志配置實戰(zhàn) .......................................................................................... 553
8.2.2 日志配置的源碼追蹤 ............................................................................... 555
8.3 時間解析 ................................................................................................................... 559
8.3.1 datetime_safe.py 文件 ............................................................................... 559
8.3.2 dateformat.py 文件 ................................................................................... 562
8.3.3 dateparse.py 文件 ...................................................................................... 565
8.4 文本處理 ................................................................................................................... 569
8.4.1 text.py 文件中的capfirst()函數和wrap()函數 .......................................... 570
8.4.2 html.py 文件中的代碼 .............................................................................. 575
8.5 其他的類與函數 ....................................................................................................... 582
8.6 小結 ........................................................................................................................... 589