本書將Django框架的特性和Web開發(fā)實(shí)戰(zhàn)結(jié)合在一起,介紹如何使用Django框架進(jìn)行Web應(yīng)用的開發(fā),幫助讀者構(gòu)建跨平臺(tái)的應(yīng)用程序,節(jié)省使用Django框架開發(fā)Web的寶貴時(shí)間。找到針對(duì)這些問題的解決方案,大多數(shù)編程難題都會(huì)迎刃而解。
本書內(nèi)容涵蓋表單處理、會(huì)話管理、數(shù)據(jù)庫交互、安全防護(hù)及程序的部署維護(hù)等運(yùn)維方面的知識(shí),并且介紹了高可用的Web應(yīng)用原理。在本書中,讀者可以更加方便地找到各種編程問題的解決方案。
本書實(shí)用性強(qiáng),特別適合使用Python/PHP等進(jìn)行Web開發(fā)的IT從業(yè)者和對(duì)Web開發(fā)感興趣的讀者閱讀。
互聯(lián)網(wǎng)大廠Django實(shí)戰(zhàn)經(jīng)驗(yàn),思路清晰,案例實(shí)用
系統(tǒng):全流程講解Django應(yīng)用開發(fā),擊破編程難點(diǎn)
專業(yè):凝聚7年P(guān)ython開發(fā)經(jīng)驗(yàn),分享開發(fā)技巧
深入:抽絲剝繭式分析,細(xì)致講解源代碼技術(shù)原理
全面:列舉常用Web開發(fā)、運(yùn)維技術(shù),拿來即用
前 言
為什么要寫這本書?
隨著技術(shù)的發(fā)展,計(jì)算機(jī)及其他硬件越來越大眾化。在許多IT企業(yè)或組織中,人力資
源正成為最寶貴的資源。同時(shí),社會(huì)信息化程度的提高,加劇了互聯(lián)網(wǎng)行業(yè)的競(jìng)爭(zhēng),眾多
企業(yè)都使用MVP(最小可行產(chǎn)品)模型來開發(fā)軟件產(chǎn)品。在這樣的背景下,程序的開發(fā)時(shí)
間比程序的執(zhí)行時(shí)間更為重要,減少每個(gè)項(xiàng)目開發(fā)所需的時(shí)間和人力可以為企業(yè)節(jié)省大量
的資金。
Django作為高級(jí)的Python Web框架,繼承了Python語言表達(dá)力強(qiáng)、開發(fā)效率高的優(yōu)點(diǎn),
正成為越來越多團(tuán)隊(duì)的技術(shù)選擇。Django除了自帶Web開發(fā)工具外,還有眾多開箱即用的
第三方Django擴(kuò)展,使工程師能夠高效率地解決更多的技術(shù)問題。程序員要想學(xué)習(xí)Django
開發(fā),除了需要有扎實(shí)的Python語言基礎(chǔ)外,還要學(xué)習(xí)Web應(yīng)用相關(guān)的知識(shí),如HTTP、緩存、
數(shù)據(jù)庫等。
另外,DevOps的流行,正在打破開發(fā)和運(yùn)維之間的邊界。在很多IT企業(yè)或組織中,
開發(fā)人員也需要參與項(xiàng)目的部署和運(yùn)維。這對(duì)開發(fā)人員提出了新的要求:不僅需要了解和
編寫業(yè)務(wù),而且需要了解高可用的技術(shù)架構(gòu)。當(dāng)下,云計(jì)算已經(jīng)成為最重要的IT基礎(chǔ)設(shè)施,
這種開發(fā)加運(yùn)維的能力正變得越來越重要。
目前圖書市場(chǎng)上關(guān)于Django框架應(yīng)用的圖書不少,但真正從實(shí)際應(yīng)用出發(fā),以用戶價(jià)
值為核心,從提出問題到需求提煉的價(jià)值探索,再到構(gòu)建應(yīng)用、運(yùn)行應(yīng)用、檢測(cè)應(yīng)用的快
速驗(yàn)證這一研發(fā)閉環(huán)為主旨的圖書卻很少。本書便是以實(shí)戰(zhàn)為主旨,以Django為切入點(diǎn),
以全面的視角介紹了Web應(yīng)用的技術(shù)架構(gòu)和常見的應(yīng)用案例,讓讀者全面、深入、透徹地
理解Web開發(fā)的各種熱門技術(shù),提高實(shí)際開發(fā)水平和實(shí)戰(zhàn)能力。
本書有何特色?
1. 涵蓋Django 主要功能和主流Python 框架的整合使用
本書涵蓋Django 模型、視圖、中間件、表單、模板、安全等主要功能,以及Django
與Celery、pyredis、django-allauth 等主流框架的整合使用。
2. 對(duì)Python Web 開發(fā)的各種技術(shù)和框架作了原理上的分析
本書從一開始便對(duì)Web 開發(fā)基礎(chǔ)和Python Web 開發(fā)的環(huán)境配置做了基本介紹,并對(duì)各
種開發(fā)技術(shù)和主流框架及其整合進(jìn)行了原理性分析,便于讀者理解書中后面介紹的典型模
塊開發(fā)和項(xiàng)目案例。
3. 涵蓋Python Web 應(yīng)用常見關(guān)聯(lián)技術(shù)棧
本書介紹了數(shù)據(jù)庫MySQL、Web 服務(wù)器Nginx、緩存服務(wù)Redis、消息隊(duì)列服務(wù)
RabbitMQ 的作用和如何在Django 中使用這些技術(shù)。另外,本書還介紹了WSGI、uwsgi、
Gunicorn、ZooKeeper、Vagrant 、Docker 和Linux 這些常用于部署和運(yùn)維Django 應(yīng)用的工
具和服務(wù)。
4. 涵蓋高可用的Web 技術(shù)架構(gòu)的原理
本書介紹了MySQL“主從同步”高可用原理、Redis 的Redis Cluster 和Codis 高可用原理、
NSQ 高可用原理、RabbitMQ 高可用原理,涵蓋了LVS 、Nginx 作為負(fù)載均衡器的工作原理,
也介紹了采集日志和監(jiān)控的常用技術(shù)棧。
本書內(nèi)容及知識(shí)體系
第1 篇開發(fā)工具及框架概述(第1 章)
本篇介紹了Django 開發(fā)環(huán)境的配置和HTTP 服務(wù)開發(fā)的基礎(chǔ)知識(shí),主要包括Web 開
發(fā)基礎(chǔ)、配置Python 開發(fā)環(huán)境、MVC 開發(fā)模式等。
第2 篇項(xiàng)目案例實(shí)戰(zhàn)(第2
~
11 章)
本篇介紹了使用Django 來開發(fā)一個(gè)小型電商網(wǎng)站的案例。開發(fā)過程包括需求分析、技
術(shù)選型及使用Django 自帶的ORM、視圖、模板、表單、緩存、異步任務(wù)、安全、訪問控制、
測(cè)試和第三方的開源工具來完成項(xiàng)目需求。
第3 篇高可用技術(shù)架構(gòu)(第12
~
16 章)
本篇介紹了如何部署、運(yùn)維和監(jiān)控以Django 為代表的Web 應(yīng)用,主要包括Web 服務(wù)器、
應(yīng)用服務(wù)器、虛擬化技術(shù)、負(fù)載均衡技術(shù)、服務(wù)發(fā)現(xiàn)技術(shù)、ELK 技術(shù)棧和監(jiān)控系統(tǒng)。
適合閱讀本書的讀者
●
需要全面學(xué)習(xí)Python Web 開發(fā)技術(shù)的人員;
●
廣大Web 開發(fā)程序員;
●
Python 程序員;
●
希望提高項(xiàng)目開發(fā)水平的人員;
●
專業(yè)培訓(xùn)機(jī)構(gòu)的學(xué)員;
●
軟件開發(fā)項(xiàng)目經(jīng)理;
●
運(yùn)維人員和DevOps 工程師。
閱讀本書的建議
●
沒有Python 基礎(chǔ)的讀者,建議從第1 章依次閱讀并演練每一個(gè)實(shí)例。
●
有一定Django 框架基礎(chǔ)的讀者,可以根據(jù)實(shí)際情況有重點(diǎn)地選擇閱讀各個(gè)模塊和
項(xiàng)目案例。
●
對(duì)于每一個(gè)模塊和項(xiàng)目案例,先自己思考一下實(shí)現(xiàn)的思路,然后帶著問號(hào)去閱讀,
學(xué)習(xí)效果會(huì)更好。
黃索遠(yuǎn),2013年開始進(jìn)入互聯(lián)網(wǎng)行業(yè),多年來一直專注于Python后臺(tái)開發(fā)工作,有扎實(shí)的理論基礎(chǔ)和豐富的實(shí)踐經(jīng)驗(yàn)。曾在騰訊、字節(jié)跳動(dòng)公司擔(dān)任高級(jí)軟件開發(fā)工程師職位。
目 錄
第 1 篇
開發(fā)工具及框架概述
第1章 從零開始學(xué)Django 2
1.1 網(wǎng)站運(yùn)行原理 2
1.1.1 HTTP 2
1.1.2 Web發(fā)展 4
1.1.3 瀏覽器 4
1.1.4 MVC模式 6
1.2 Python Web編程6
1.2.1 通用網(wǎng)關(guān)接口 7
1.2.2 WSGI協(xié)議 7
1.2.3 模板引擎 8
1.3 快速上手Django 8
1.3.1 配置開發(fā)環(huán)境 8
1.3.2 創(chuàng)建項(xiàng)目 10
1.3.3 配置說明 11
1.3.4 創(chuàng)建應(yīng)用 12
1.3.5 啟動(dòng)開發(fā)服務(wù)器 13
1.3.6 編寫一個(gè)頁面 13
1.4 總結(jié) 14
1.5 練習(xí) 14
第 2 篇
項(xiàng)目案例實(shí)戰(zhàn)
第2章 構(gòu)建電商網(wǎng)站 16
2.1 網(wǎng)站需求分析 16
2.1.1 需求 16
2.1.2 需求分析 17
2.2 網(wǎng)站結(jié)構(gòu) 18
2.2.1 分層設(shè)計(jì) 18
2.2.2 技術(shù)選型 19
2.3 用戶模塊 20
2.3.1 Django自帶的用戶模塊 20
2.3.2 一對(duì)一擴(kuò)展用戶模型 22
2.3.3 繼承AbstractBaseUser 25
2.3.4 繼承AbstractUser 27
2.4 商品庫模塊 27
2.4.1 設(shè)計(jì)模型 28
2.4.2 獲取商品 28
2.5 訂單模塊 29
2.5.1 購物籃模型 29
2.5.2 訂單模型 30
?
VI Django項(xiàng)目開發(fā)實(shí)戰(zhàn)
2.5.3 獲取訂單數(shù)據(jù) 31
2.6 統(tǒng)計(jì)模塊 33
2.7 總結(jié) 34
2.8 練習(xí) 34
第3 章 Django 和數(shù)據(jù)庫35
3.1 管理 35
3.1.1 配置 35
3.1.2 連接池 37
3.1.3 更改表結(jié)構(gòu) 38
3.2 查詢 40
3.2.1 保存對(duì)象 40
3.2.2 獲取對(duì)象 41
3.2.3 懶加載和緩存 42
3.2.4 聚合查詢 43
3.3 事務(wù) 44
3.3.1 事務(wù)管理 44
3.3.2 自動(dòng)提交 45
3.3.3 提交后執(zhí)行操作 46
3.4 數(shù)據(jù)庫并發(fā)控制 47
3.4.1 沖突 47
3.4.2 悲觀鎖 48
3.4.3 樂觀鎖 50
3.4.4 解決沖突 51
3.5 數(shù)據(jù)庫擴(kuò)展 52
3.5.1 擴(kuò)展方法 52
3.5.2 讀寫分離 53
3.5.3 垂直分庫 55
3.5.4 水平擴(kuò)展 57
3.5.5 算法分片 58
3.5.6 動(dòng)態(tài)分片 60
3.5.7 全局ID 62
3.6 MySQL 實(shí)踐 63
3.7 總結(jié) 64
3.8 練習(xí) 64
第4 章視圖65
4.1 配置URL 65
4.1.1 URL 匹配 65
4.1.2 配置嵌套 66
4.1.3 反向解析URL 67
4.2 視圖函數(shù) 69
4.2.1 視圖函數(shù) 69
4.2.2 請(qǐng)求和響應(yīng)對(duì)象 70
4.2.3 模板響應(yīng)對(duì)象 71
4.3 視圖類 72
4.3.1 基本用法 72
4.3.2 視圖類的優(yōu)點(diǎn) 73
4.4 文件上傳 74
4.4.1 文件表單 74
4.4.2 文件存儲(chǔ) 75
4.4.3 使用對(duì)象存儲(chǔ)系統(tǒng) 76
4.5 生成文件 79
4.5.1 生成CSV 文件 79
4.5.2 生成PDF 文件 80
4.6 中間件 81
4.7 總結(jié) 83
4.8 練習(xí) 83
第5 章模板84
5.1 Web 模板系統(tǒng) 84
5.2 Django 模板系統(tǒng) 85
?
目 錄VII
5.2.1 配置 85
5.2.2 模板語言 86
5.3 模板繼承 88
5.4 字符轉(zhuǎn)義 90
5.5 自定義標(biāo)簽和過濾器 92
5.5.1 代碼路徑 92
5.5.2 編寫自定義過濾器 93
5.5.3 自定義標(biāo)簽 93
5.6 總結(jié) 95
5.7 練習(xí) 95
第6 章表單96
6.1 網(wǎng)頁表單 96
6.1.1 表單元素 96
6.1.2 提交數(shù)據(jù) 98
6.2 Django 表單 98
6.2.1 處理流程 99
6.2.2 Form 類100
6.2.3 ModelForm 類 102
6.2.4 表單集合 103
6.3 AJAX 表單 105
6.3.1 AJAX 技術(shù)105
6.3.2 動(dòng)態(tài)表單 106
6.4 驗(yàn)證碼 107
6.4.1 表單驗(yàn)證碼 108
6.4.2 AJAX 驗(yàn)證碼109
6.5 總結(jié) 110
6.6 練習(xí) 110
第7 章 Django 和緩存111
7.1 Web 緩存系統(tǒng) 111
7.1.1 Redis 緩存 111
7.1.2 HTTP 緩存 114
7.2 Django 緩存系統(tǒng) 115
7.2.1 配置緩存 116
7.2.2 使用緩存 117
7.2.3 緩存頁面 118
7.2.4 使用HTTP 緩存 120
7.3 緩存替換策略 122
7.4 寫入策略 126
7.4.1 Cache-Aside 模式126
7.4.2 Write-Through 模式 128
7.4.3 Write-Back 模式129
7.5 高可用緩存系統(tǒng) 131
7.5.1 Redis 集群 131
7.5.2 Codis 集群133
7.5.3 緩存穿透和雪崩 134
7.6 總結(jié) 135
7.7 練習(xí) 135
第8 章 Django 和消息隊(duì)列136
8.1 消息隊(duì)列 136
8.1.1 消息隊(duì)列系統(tǒng) 136
8.1.2 使用消息隊(duì)列 138
8.1.3 AMQP 139
8.1.4 使用RabbitMQ 141
8.2 Django 和Celery 框架 143
8.2.1 任務(wù)類 143
8.2.2 在Django 中使用Celery 145
8.2.3 定時(shí)任務(wù) 148
8.2.4 任務(wù)路由 150
8.2.5 任務(wù)工作流 151
?
VIII Django項(xiàng)目開發(fā)實(shí)戰(zhàn)
8.2.6 最佳實(shí)踐 153
8.3 高可用消息隊(duì)列 154
8.3.1 RabbitMQ 高可用 154
8.3.2 NSQ 系統(tǒng) 155
8.4 總結(jié) 156
8.5 練習(xí) 156
第9 章 Django 與安全157
9.1 安全中間件 157
9.1.1 跨站點(diǎn)腳本防護(hù) 157
9.1.2 跨站點(diǎn)偽造請(qǐng)求防護(hù) 158
9.1.3 SQL 注入防護(hù) 161
9.1.4 點(diǎn)擊劫持 162
9.1.5 訪問白名單 163
9.2 數(shù)據(jù)安全 164
9.2.1 密碼保護(hù) 164
9.2.2 安全連接 166
9.2.3 請(qǐng)求簽名 169
9.2.4 重放攻擊 171
9.3 總結(jié) 173
9.4 練習(xí) 173
第10 章 Django 和訪問控制174
10.1 認(rèn)證方式 174
10.1.1 HTTP 基本訪問認(rèn)證 174
10.1.2 訪問令牌 176
10.1.3 簽名驗(yàn)證 179
10.1.4 OAuth2 驗(yàn)證 181
10.2 會(huì)話狀態(tài) 184
10.3 控制策略 186
10.3.1 訪問控制列表 186
10.3.2 Django 權(quán)限系統(tǒng) 188
10.3.3 基于身份的訪問控制 189
10.4 總結(jié) 191
10.5 練習(xí) 192
第11 章 Django 和測(cè)試193
11.1 單元測(cè)試 193
11.2 Django 單元測(cè)試 194
11.2.1 編寫測(cè)試用例 195
11.2.2 運(yùn)行測(cè)試用例 196
11.3 Django 測(cè)試工具 198
11.3.1 測(cè)試客戶端 198
11.3.2 測(cè)試類 200
11.4 Mock 測(cè)試 201
11.4.1 Mock 對(duì)象 202
11.4.2 模擬返回值 203
11.4.3 副作用 205
11.4.4 限定模擬的范圍 207
11.5 總結(jié) 208
11.6 練習(xí) 209
第 3 篇
高可用技術(shù)架構(gòu)
第12 章 Django 與部署212
12.1 軟件部署 212
12.2 部署Django 213
12.2.1 Web 服務(wù)網(wǎng)關(guān)接口 214
12.2.2 配置uWSGI 服務(wù)器 215
12.2.3 配置Gunicorn 服務(wù)器 218
?
目 錄IX
12.2.4 配置Nginx 服務(wù)器 223
12.3 服務(wù)管理 224
12.3.1 使用Supervisord 管理服務(wù)225
12.3.2 使用systemd 管理服務(wù) 226
12.4 Django 與虛擬化技術(shù) 228
12.4.1 使用Vagrant 部署Django 應(yīng)用228
12.4.2 使用Docker 部署Django 應(yīng)用231
12.4.3 Docker 的reap 問題234
12.5 總結(jié) 236
12.6 練習(xí) 236
第13 章 Django 與負(fù)載均衡237
13.1 調(diào)度算法 237
13.1.1 循環(huán)調(diào)度算法 237
13.1.2 最少連接調(diào)度算法 239
13.1.3 哈希調(diào)度算法 240
13.2 網(wǎng)絡(luò)冗余 241
13.2.1 網(wǎng)卡綁定 241
13.2.2 虛擬路由器冗余 242
13.3 常用負(fù)載均衡器 245
13.3.1 負(fù)載均衡器的類型 245
13.3.2 Linux 虛擬服務(wù)器246
13.3.3 Nginx 反向代理 250
13.4 服務(wù)發(fā)現(xiàn) 252
13.4.1 服務(wù)注冊(cè)中心 252
13.4.2 注冊(cè)服務(wù) 254
13.4.3 發(fā)現(xiàn)服務(wù) 256
13.5 總結(jié) 259
13.6 練習(xí) 260
第14 章 Django 與日志261
14.1 Python 日志模塊 261
14.1.1 日志模塊組件 261
14.1.2 使用日志模塊 263
14.1.3 配置日志模塊 266
14.2 Django 日志工具 267
14.3 日志管理 268
14.3.1 Elastic 技術(shù)棧 269
14.3.2 Elasticsearch 集群 273
14.4 總結(jié) 275
14.5 練習(xí) 276
第15 章監(jiān)控277
15.1 監(jiān)控?cái)?shù)據(jù)采集 277
15.1.1 工作指標(biāo) 277
15.1.2 資源指標(biāo) 278
15.1.3 事件 279
15.1.4 收集數(shù)據(jù) 280
15.2 告警 281
15.3 使用Prometheus 282
15.3.1 Prometheus 的工作方式282
15.3.2 抓取Linux 系統(tǒng)數(shù)據(jù)284
15.3.3 抓取Nginx 監(jiān)控?cái)?shù)據(jù) 286
15.3.4 抓取MySQL 監(jiān)控?cái)?shù)據(jù) 288
15.3.5 數(shù)據(jù)存儲(chǔ) 289
15.3.6 告警 290
15.4 總結(jié) 291
15.5 練習(xí) 291
?
第16章 常用工具 292
16.1 Git版本控制系統(tǒng) 292
16.1.1 Git工作方式 292
16.1.2 Gitflow工作流 294
16.1.3 Git日志用法 296
16.2 Linux常用軟件 297
16.2.1 安全Shell 297
16.2.2 進(jìn)程狀態(tài) 299
16.2.3 系統(tǒng)性能 301
16.3 性能剖析 303
16.3.1 調(diào)用路徑圖 304
16.3.2 性能測(cè)試 306
16.3.3 使用Pyflame生成火焰圖 308
16.4 總結(jié) 310
16.5 練習(xí) 310