李輝 著
適讀人群 :本書適合了解Python基本語法,想要自己動手做網(wǎng)站的編程人員;熟悉Python。想要從事Python Web開發(fā)的后端工程師、運維工程師和爬蟲工程師;香蔥Django等其他Python Web框架轉向Flask的Python工程師閱讀。
(1)作者是Flask官方開發(fā)團隊成員,為Flask和其他多個Python項目貢獻源代碼,是知乎著名專欄“Hello, Flask!”的作者
(2)本書獲得Flask開發(fā)團隊核心維護者高度評價
(3)內(nèi)容全面,從基礎知識到進階實戰(zhàn),再到源碼分析,提供完善的Flask學習路徑;
(4)實戰(zhàn)性強,5個綜合性案例將不同難度層級的知識點及具體原理串聯(lián)起來,讓你在開發(fā)技巧、原理實現(xiàn)和編程思想上都獲得相應提升;
(5)技術新穎,F(xiàn)lask框架本身,以及其他相關Python框架,全部使用的是新發(fā)布的技術版本。
本書由Flask官方團隊的開發(fā)成員撰寫,得到了Flask項目核心維護者的高度認可。
內(nèi)容上,本書從基礎知識到進階實戰(zhàn),再到Flask原理和工作機制解析,涵蓋完整的Flask Web開發(fā)學習路徑,非常全面。
實戰(zhàn)上,本書從開發(fā)環(huán)境的搭建、項目的建立與組織到程序的編寫,再到自動化測試、性能優(yōu)化,最后到生產(chǎn)環(huán)境的搭建和部署上線,詳細講解完整的Flask Web程序開發(fā)流程,用5個綜合性案例將不同難度層級的知識點及具體原理串聯(lián)起來,讓你在開發(fā)技巧、原理實現(xiàn)和編程思想上都獲得相應的提升。
技術上,基于Flask全新的穩(wěn)定版本,同時兼容Python2.7和Python3.6,而且連相關的Python工具包使用的也是全新的版本。同時,對未來可能有變化的地方進行了說明,以此確保本書內(nèi)容在一定時間內(nèi)不會過時。
本書共16章,分為三部分。
第一部分 基礎篇(第1~6章)
通過大量的程序?qū)嵗敿毥榻B了Flask的所有基礎知識,同時在每章的后面又提供了一些進階技巧,供進階讀者學習。
第二部分 實戰(zhàn)篇(第7~11章)
通過5個真實的項目案例來串接和闡釋不同的知識點,難度逐漸遞增。這5個案例分別為:留言板SayHello、個人博客Bluelog、圖片社交網(wǎng)站Albumy、待辦事項程序Todoism和聊天室CatChat。
第三部分 進階篇(第12~16章)
首先介紹了Flask程序的部署流程:測試、性能優(yōu)化和部署上線;然后通過一個真實的實例講解了Flask擴展的開發(fā),最后以源代碼為切入點深入剖析了Flask的實現(xiàn)原理與主要工作機制。
李輝(Grey Li)
Flask官方開發(fā)團隊(Pallets Team)成員,知乎專欄“Hello, Flask!”作者,HelloFlask.com網(wǎng)站創(chuàng)建者。對Flask有非常深入的研究,熟悉它的源代碼,有豐富的項目經(jīng)驗。他熱愛分享和創(chuàng)造,曾為Flask等多個開源項目貢獻過代碼,你可以在GitHub(github.com/greyli)上看到他的開源活動。在他的個人網(wǎng)站(greyli.com)上,你可以了解到關于他的更多信息。
這本書內(nèi)容翔實,推薦給想要系統(tǒng)學習Flask的人。不要漏掉書中的小知識點哦。
——Hsiaoming Yang Flask開發(fā)團隊核心維護者
這本《Flask Web開發(fā)實戰(zhàn)》非常有趣,是一本能夠給讀者帶來幫助的書,作為一個Flask框架的愛好者,我也很期待這本書的出版。
——黃健宏 《Redis設計與實現(xiàn)》作者
Grey Li is a really helpful contributor to Flask and the Python community. He is making it easier for more people to learn and use Flask.
——David Lord Flask開發(fā)團隊核心維護者
目錄 Contents
前言
第一部分 基礎篇
第1章 初識Flask2
1.1 搭建開發(fā)環(huán)境3
1.1.1 Pipenv工作流3
1.1.2 安裝Flask7
1.1.3 集成開發(fā)環(huán)境8
1.2 Hello, Flask!11
1.2.1 創(chuàng)建程序?qū)嵗?1
1.2.2 注冊路由12
1.3 啟動開發(fā)服務器14
1.3.1 Run,F(xiàn)lask,Run!14
1.3.2 更多的啟動選項18
1.3.3 設置運行環(huán)境18
1.4 Python Shell20
1.5 Flask擴展21
1.6 項目配置22
1.7 URL與端點23
1.8 Flask命令23
1.9 模板與靜態(tài)文件24
1.10 Flask與MVC架構25
1.11 本章小結26
第2章 Flask與HTTP27
2.1 請求響應循環(huán)27
2.2 HTTP請求29
2.2.1 請求報文29
2.2.2 Request對象31
2.2.3 在Flask中處理請求34
2.2.4 請求鉤子37
2.3 HTTP響應38
2.3.1 響應報文39
2.3.1 在Flask中生成響應40
2.3.2 響應格式43
2.3.3 來一塊Cookie46
2.3.4 session:安全的Cookie49
2.4 Flask上下文54
2.4.1 上下文全局變量54
2.4.2 激活上下文55
2.4.3 上下文鉤子56
2.5 HTTP進階實踐57
2.5.1 重定向回上一個頁面57
2.5.2 使用AJAX技術發(fā)送異步請求60
2.5.3 HTTP服務器端推送64
2.5.4 Web安全防范65
2.6 本章小結74
第3章 模板75
3.1 模板基本用法75
3.1.1 創(chuàng)建模板76
3.1.2 模板語法77
3.1.3 渲染模板78
3.2 模板輔助工具80
3.2.1 上下文80
3.2.2 全局對象82
3.2.3 過濾器83
3.2.4 測試器85
3.2.5 模板環(huán)境對象87
3.3 模板結構組織88
3.3.1 局部模板88
3.3.2 宏88
3.3.3 模板繼承90
3.4 模板進階實踐93
3.4.1 空白控制93
3.4.2 加載靜態(tài)文件94
3.4.3 消息閃現(xiàn)98
3.4.4 自定義錯誤頁面100
3.4.5 JavaScript和CSS中的Jinja2101
3.5 本章小結103
第4章 表單104
4.1 HTML表單104
4.2 使用Flask-WTF處理表單106
4.2.1 定義WTForms表單類106
4.2.2 輸出HTML代碼109
4.2.3 在模板中渲染表單110
4.3 處理表單數(shù)據(jù)112
4.3.1 提交表單112
4.3.2 驗證表單數(shù)據(jù)113
4.3.3 在模板中渲染錯誤消息117
4.4 表單進階實踐118
4.4.1 設置錯誤消息語言118
4.4.2 使用宏渲染表單120
4.4.3 自定義驗證器121
4.4.4 文件上傳122
4.4.5 使用Flask-CKEditor集成富文本編輯器129
4.4.6 單個表單多個提交按鈕132
4.4.7 單個頁面多個表單133
4.5 本章小結137
第5章 數(shù)據(jù)庫138
5.1 數(shù)據(jù)庫的分類139
5.1.1 SQL139
5.1.2 NoSQL139
5.1.3 如何選擇?140
5.2 ORM魔法140
5.3 使用Flask-SQLAlchemy管理數(shù)據(jù)庫142
5.3.1 連接數(shù)據(jù)庫服務器142
5.3.2 定義數(shù)據(jù)庫模型144
5.3.3 創(chuàng)建數(shù)據(jù)庫和表145
5.4 數(shù)據(jù)庫操作146
5.4.1 CRUD147
5.4.2 在視圖函數(shù)里操作數(shù)據(jù)庫151
5.5 定義關系156
5.5.1 配置Python Shell上下文157
5.5.2 一對多158
5.5.3 多對一164
5.5.4 一對一165
5.5.5 多對多166
5.6 更新數(shù)據(jù)庫表168
5.6.1 重新生成表168
5.6.2 使用Flask-Migrate遷移數(shù)據(jù)庫169
5.6.3 開發(fā)時是否需要遷移?171
5.7 數(shù)據(jù)庫進階實踐172
5.7.1 級聯(lián)操作172
5.7.2 事件監(jiān)聽175
5.8 本章小結177
第6章 電子郵件178
6.1 使用Flask-Mail發(fā)送電子郵件179
6.1.1 配置Flask-Mail179
6.1.2 構建郵件數(shù)據(jù)182
6.1.3 發(fā)送郵件182
6.2 使用事務郵件服務SendGird183
6.2.1 注冊SendGird183
6.2.2 SendGrid SMTP轉發(fā)185
6.2.3 SendGrid Web API轉發(fā)185
6.3 電子郵件進階實踐188
6.3.1 提供HTML正文188
6.3.2 使用Jinja2模板組織郵件正文189
6.3.3 異步發(fā)送郵件191
6.4 本章小結192
第二部分 實戰(zhàn)篇
第7章 留言板194
7.1 使用包組織代碼195
7.1.1 配置文件196
7.1.2 創(chuàng)建程序?qū)嵗?97
7.2 Web程序開發(fā)流程198
7.2.1 程序功能設計199
7.2.1 前端頁面開發(fā)200
7.2.3 后端程序開發(fā)202
7.3 使用Bootstrap-Flask簡化頁面編寫206
7.3.1 加載資源文件207
7.3.2 快捷渲染表單207
7.4 使用Flask-Moment本地化日期和時間209
7.4.1 本地化前的準備209
7.4.2 使用Flask-Moment集成Moment.js209
7.4.3 渲染時間日期210
7.5 使用Faker生成虛擬數(shù)據(jù)213
7.6 使用Flask-DebugToolbar調(diào)試程序215
7.7 Flask配置的兩種組織形式216
7.7.1 環(huán)境變量優(yōu)先217
7.7.2 實例文件夾覆蓋217
7.8 本章小結218
第8章 個人博客219
8.1 大型項目結構220
8.1.1 使用藍本模塊化程序221
8.1.2 使用類組織配置227
8.1.3 使用工廠函數(shù)創(chuàng)建程序?qū)嵗?28
8.2 編寫程序骨架232
8.2.1 數(shù)據(jù)庫233
8.2.2 模板240
8.2.3 表單246
8.2.4 視圖函數(shù)249
8.2.5 電子郵件支持249
8.3 編寫博客前臺251
8.3.1 分頁顯示文章列表251
8.3.2 顯示文章正文258
8.3.3 文章固定鏈接259
8.3.4 顯示分類文章列表262
8.3.5 顯示評論列表263
8.3.6 發(fā)表評論與回復266
8.3.7 支持回復評論267
8.3.8 網(wǎng)站主題切換269
8.4 初始化博客271
8.4.1 安全存儲密碼271
8.4.2 創(chuàng)建管理員用戶273
8.5 使用Flask-Login管理用戶認證275
8.5.1 獲取當前用戶276
8.5.2 登入用戶277
8.5.3 登出用戶278
8.5.4 視圖保護279
8.6 使用CSRFProtect實現(xiàn)CSRF保護281
8.7 編寫博客后臺283
8.7.1 文章管理284
8.7.2 評論管理291
8.7.3 分類管理297
8.8 本章小結298
第9章 圖片社交網(wǎng)站299
9.1 項目組織架構300
9.1.1 功能式架構300
9.1.2 分區(qū)式架構302
9.1.3 混合式架構303
9.1.4 如何選擇303
9.2 編寫程序骨架303
9.2.1 數(shù)據(jù)庫模型與虛擬數(shù)據(jù)305
9.2.2 模板與靜態(tài)文件307
9.3 高級用戶認證308
9.3.1 用戶注冊309
9.3.2 驗證郵箱地址311
9.3.3 使用裝飾器過濾未確認用戶315
9.3.4 密碼重置316
9.4 基于用戶角色的權限管理319
9.4.1 角色與權限模型319
9.4.2 設置角色與權限320
9.4.3 寫入角色與權限321
9.4.4 驗證用戶權限323
9.5 使用Flask-Dropzone優(yōu)化文件上傳325
9.5.1 配置Flask-Dropzone326
9.5.2 渲染上傳區(qū)域328
9.5.3 處理并保存上傳圖片329
9.6 使用Flask-Avatars處理用戶頭像334
9.6.1 默認頭像335
9.6.2 生成隨機頭像335
9.7 圖片展示與管理337
9.7.1 在用戶主頁顯示圖片列表338
9.7.2 圖片詳情頁341
9.7.3 上一張下一張?zhí)D342
9.7.4 刪除確認模態(tài)框344
9.7.5 舉報圖片346
9.7.6 圖片描述347
9.7.7 圖片標簽349
9.7.8 用戶資料彈窗353
9.8 收藏圖片358
9.8.1 使用關聯(lián)模型表示多對多關系358
9.8.2 添加和取消收藏360
9.8.3 收藏者和收藏頁面362
9.9 用戶關注365
9.9.1 自引用多對多關系365
9.9.2 關注與取消關注366
9.9.3 顯示關注用戶列表369
9.9.4 使用AJAX在彈窗中執(zhí)行關注操作371
9.10 消息提醒378
9.10.1 提醒消息在數(shù)據(jù)庫中的表示379
9.10.2 創(chuàng)建提醒379
9.10.3 顯示和管理提醒380
9.10.4 通過輪詢實時更新未讀計數(shù)382
9.11 用戶資料與賬戶設置384
9.11.1 編輯個人資料385
9.11.2 自定義頭像386
9.11.3 更改密碼392
9.11.4 提醒消息開關394
9.11.5 將收藏設為僅自己可見395
9.11.6 注銷賬戶396
9.12 首頁與探索397
9.12.1 獲取正在關注用戶的圖片399
9.12.2 使用聯(lián)結和分組查詢獲取熱門標簽401
9.12.3 使用數(shù)據(jù)庫通用函數(shù)獲取隨機圖片402
9.13 使用Flask-Whooshee實現(xiàn)全文搜索403
9.13.1 創(chuàng)建索引404
9.13.2 搜索表單405
9.13.3 顯示搜索結果406
9.14 編寫網(wǎng)站后臺407
9.14.1 用戶管理408
9.14.2 資源管理411
9.14.3 面向管理員的用戶資料編輯412
9.15 本章小結413
第10章 待辦事項程序415
10.1 使用JavaScript和AJAX編寫單頁程序417
10.1.1 單頁程序的模板組織418
10.1.2 在根頁面內(nèi)切換子頁面421
10.1.3 生成測試賬戶423
10.1.4 添加新待辦條目424
10.2 國際化與本地化426
10.2.1 使用Flask-Babel集成Babel427
10.2.2 區(qū)域和語言427
10.2.3 文本的國際化432
10.2.4 文本的本地化433
10.2.5 時間與日期的本地化438
10.3 設計并編寫Web API440
10.3.1 認識Web API441
10.3.2 設計優(yōu)美實用的Web API443
10.3.3 使用Flask編寫Web API446
10.3.4 使用OAuth認證453
10.3.5 資源的序列化461
10.3.6 資源的反序列化465
10.3.7 Web API的測試與發(fā)布470
10.4 本章小結473
第11章 在線聊天室474
11.1 編寫程序骨架476
11.2 Gravatar頭像477
11.3 使用Flask-SocketIO建立實時雙向通信480
11.3.1 建立Socket.IO連接481
11.3.2 一條消息的旅程482
11.3.3 在線人數(shù)統(tǒng)計485
11.3.4 通信頻道分離486
11.4 使用Flask-OAuthlib實現(xiàn)第三方登錄489
11.4.1 編寫OAuth客戶端490
11.4.2 注冊OAuth程序491
11.4.3 處理OAuth2授權493
11.4.4 處理OAuth1授權505
11.5 聊天室功能增強507
11.5.1 無限滾動加載歷史消息507
11.5.2 Markdown支持510
11.5.3 代碼語法高亮512
11.5.4 標簽頁消息提醒515
11.5.5 瀏覽器桌面通知517
11.5.6 消息管理519
11.6 本章小結519
第三部分 進階篇
第12章 自動化測試522
12.1 認識自動化測試522
12.2 Flask測試客戶端523
12.3 使用unittest編寫單元測試525
12.3.1 Flask程序的測試固件525
12.3.2 編寫測試用例527
12.3.3 組織測試533
12.3.4 運行測試535
12.4 使用Selenium進行用戶界面測試536
12.4.1 安裝瀏覽器與驅(qū)動537
12.4.2 準備測試環(huán)境538
12.4.3 編寫測試代碼539
12.5 使用Coverage.py計算測試覆蓋率541
12.5.1 基本用法542
12.5.2 獲取測試覆蓋率543
12.6 使用Flake8檢查代碼質(zhì)量544
12.7 本章小結546
第13章 性能優(yōu)化547
13.1 程序性能分析548
13.1.1 函數(shù)性能分析548
13.1.2 數(shù)據(jù)庫查詢分析549
13.2 使用Flask-Caching設置緩存551
13.2.1 緩存視圖函數(shù)552
13.2.2 緩存其他函數(shù)554
13.2.3 更新緩存554
13.2.4 使用Redis作為緩存后端556
13.3 使用Flask-Assets優(yōu)化靜態(tài)資源557
13.3.1 注冊資源集558
13.3.2 生成資源集文件559
13.3.3 在模板中加載資源集559
13.4 本章小結562
第14章 部署上線563
14.1 傳統(tǒng)部署VS云部署563
14.2 基本部署流程564
14.3 部署前的準備566
14.3.1 更新程序配置566
14.3.2 創(chuàng)建生產(chǎn)環(huán)境專用的程序?qū)嵗?67
14.3.3 設置遷移工具568
14.3.4 程序日志568
14.3.5 手動導入環(huán)境變量572
14.3.6 HTTPS轉發(fā)572
14.4 部署到Linux服務器573
14.4.1 使用OpenSSH登錄遠程主機573
14.4.2 安裝基本庫和工具574
14.4.3 安全防護措施575
14.4.4 推送代碼并初始化程序環(huán)境578
14.4.5 使用Gunicorn運行程序579
14.4.6 使用Nginx提供反向代理580
14.4.7 使用Supervisor管理進程584
14.4.8 更新部署后的程序586
14.5 部署到PythonAnywhere587
14.5.1 反向代理設置587
14.5.2 創(chuàng)建PythonAnywhere程序588
14.5.3 推送代碼并初始化程序環(huán)境588
14.5.4 創(chuàng)建數(shù)據(jù)庫590
14.5.5 設置虛擬環(huán)境591
14.5.6 靜態(tài)文件592
14.5.7 運行和更新程序592
14.6 部署到Heroku594
14.6.1 通過Heroku Git部署595
14.6.2 使用GitHub部署601
14.7 下一步做什么?603
14.8 本章小結604
第15章 Flask擴展開發(fā)605
15.1 擴展的命名606
15.2 擴展項目骨架606
15.3 編寫擴展類608
15.4 添加擴展配置610
15.5 實現(xiàn)擴展功能610
15.5.1 加載靜態(tài)資源611
15.5.2 創(chuàng)建分享組件612
15.5.3 在移動設備上隱藏613
15.6 開源發(fā)布前的準備614
15.6.1 添加文檔字符串與注釋614
15.6.2 編寫README與文檔615
15.6.3 為打包做準備616
15.6.4 編寫示例程序621
15.6.5 編寫單元測試621
15.7 發(fā)布到PyPI622
15.7.1 創(chuàng)建PyPI賬號623
15.7.2 使用setuptools打包623
15.7.3 使用twine上傳625
15.8 編寫良好的擴展625
15.9 本章小結627
第16章 Flask工作原理與機制解析628
16.1 閱讀Flask源碼628
16.1.1 獲取Flask源碼628
16.1.2 如何閱讀源碼629
16.1.3 Flask發(fā)行版本分析637
16.2 Flask的設計理念638
16.2.1 “微”框架638
16.2.2 兩個核心依賴638
16.2.3 顯式程序?qū)ο?38
16.2.4 本地上下文639
16.2.5 三種程序狀態(tài)640
16.2.6 豐富的自定義支持641
16.3 Flask與WSGI641
16.3.1 WSGI程序642
16.3.2 WSGI服務器643
16.3.3 中間件644
16.4 Flask的工作流程與機制646
16.4.1 Flask中的請求響應循環(huán)646
16.4.2 路由系統(tǒng)649
16.4.3 本地上下文653
16.4.4 請求與響應對象665
16.4.5 session667
16.4.6 藍本674
16.4.7 模板渲染677
16.5 本章小結680
附錄A Flask資源681
Preface 前 言
Flask是目前最流行的Python Web框架之一。自2010年開源以來,F(xiàn)lask受到了越來越多的Python開發(fā)者的喜歡,其受歡迎程度不輸于Django。截至2018年6月,它在GitHub上已有近36 000個Star,2000多位Watcher,是目前GitHub中Star數(shù)最多的Python Web框架。
Flask的logo
Flask的圖標雖然看起來很像辣椒,但其實它是角狀的容器(powder horn)。
Flask僅保留了Web框架的核心,其他的功能都交給擴展實現(xiàn)。如果沒有合適的擴展,你甚至可以自己編寫。Flask不會替你做決定,也不會限制你的選擇。它足夠輕量,你可以只用5行就編寫出一個最簡單的Web程序,但并不簡陋,它能夠適應各類項目的開發(fā)。
因為Flask的靈活性,越來越多的公司選擇Flask作為Web框架,甚至開始從Django遷移到Flask。使用Flask的公司在國外有Netflix、Reddit、Twilio、Mailgun等,在國內(nèi)則有豆瓣、果殼、下廚房等,這說明Flask能經(jīng)受大型項目的挑戰(zhàn),能夠適應各種需求。下圖列出了部分使用Flask的公司。
你可以在StackShare上查看完整的使用Flask的公司列表(https://stackshare.io/flask)。
使用Flask的公司
在國內(nèi),越來越多的Python程序員開始關注和學習Flask。對于國內(nèi)的程序員來說,相關書籍僅有一兩本,內(nèi)容上也過于陳舊和單薄,希望本書可以填補這一空白。本書提供了學習Flask的完整路徑,從基礎內(nèi)容到進階實踐,再到源碼分析。同時也安排了豐富的示例程序,讓讀者可以通過親自實踐來更快地掌握Flask開發(fā)。
更多建議: