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