關于我們
書單推薦
新書推薦
|
Flask Web開發(fā)實戰(zhàn):入門、進階與原理解析 本書由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使用的是新發(fā)布的穩(wěn)定版,而且連相關的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)原理與主要工作機制。 (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是目前最流行的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ā)。 Flask自2010年開源以來在Google上的搜索趨勢 目標讀者 在技術層面,本書適合所有Python程序員(了解Python即可)閱讀,包括已經(jīng)學習過其他Python Web框架(比如Django)的讀者和沒有接觸過Web框架的讀者。 在難度水平層面,本書適合新手以及中級讀者閱讀。新手會在這里學到Flask的基礎內(nèi)容,并且通過豐富、完善的實例學習Flask開發(fā)的方方面面;中級讀者則可以通過閱讀和實踐進階內(nèi)容來進一步提高Flask開發(fā)能力。 綜上所述,本書主要適合以下幾類讀者: 了解Python基本語法,想要自己動手做網(wǎng)站的編程愛好者。 熟悉Python,想要從事Python Web開發(fā)的后端工程師、運維工程師和爬蟲工程師。 想要從Django等其他Python Web框架轉向Flask的Python工程師。 本書主要特點 本書主要有三個顯著的特點: (1)內(nèi)容全面 本書內(nèi)容覆蓋了Flask Web開發(fā)的完整路徑:從基礎知識的學習,到不同類型和復雜程度的程序的編寫,再到代碼的測試優(yōu)化以及Flask源碼分析;從基礎的內(nèi)容管理,到用戶認證和權限管理,再到Flask與JavaScript的數(shù)據(jù)交互、Web API的編寫以及WebSocket的應用等。 (2)實踐豐富 本書包含大量代碼片段,并附帶多個完整可運行的示例程序。在本書第一部分的第2~6章均分別提供一個示例程序;第二部分則會通過介紹5個比較完善的Flask項目來講解各個方面的進階知識;在第三部分還會通過一個真實的擴展來講解Flask擴展開發(fā)。通過將各類知識融入實際的項目開發(fā)實踐中,可以讓你更直觀地了解具體的代碼實現(xiàn),并且快速應用到實際開發(fā)中。 (3)內(nèi)容最新 本書的另一個特點就是內(nèi)容保證最新。書中的代碼和示例程序都基于Flask最新發(fā)布的穩(wěn)定版1.0。書中涉及的其他Pyhton包和前端框架(Boostrap、Materialize等)全部使用最新版本,并且對未來可能會有的變化會加以說明。這些特點可以保證書中的內(nèi)容在一定時間內(nèi)不會過時。對于其他書籍或教程中存在的關于Flask的誤區(qū),本書也會逐一糾正說明。 除了使用的工具保持最新,本書還引入了Python和Flask開發(fā)中的新變化,比如Flask的命令行系統(tǒng)、新的Python包管理工具(Pipenv)、新的包上傳工具(twine)、新的PyPI站點(https://pypi.org)、在PyPI上使用Markdown格式的README…… 本書核心內(nèi)容 本書由三部分組成,分別為基礎篇、實戰(zhàn)篇、進階篇,共16章。本書章節(jié)經(jīng)過精心設計,力求讓讀者可以循序漸進地掌握Flask開發(fā)的基礎知識和技巧。 第一部分:基礎篇。介紹Flask開發(fā)相關的基礎知識。 第1章:搭建開發(fā)環(huán)境,編寫一個最小的Flask程序并運行它,了解Flask基本知識。 第2章:介紹Flask與HTTP的交互方式以及相關的Flask功能。 第3章:介紹Jinja2模板的使用。 第4章:介紹Web表單的創(chuàng)建和表單數(shù)據(jù)的驗證。 第5章:介紹在Flask程序中使用數(shù)據(jù)庫進行CRUD操作。 第6章:介紹在Flask程序中發(fā)送電子郵件的幾種方式。 第二部分:實戰(zhàn)篇。通過幾個示例程序來介紹Flask開發(fā)中各類功能的實現(xiàn)方法和技巧。 第7章:通過一個簡單的留言板程序SayHello介紹Web開發(fā)的基本流程和基本的項目管理方式,對第一部分的基礎知識進行簡單回顧。 第8章 :通過個人博客程序Bluelog介紹CRUD操作、用戶認證、文章評論、管理后臺等功能。 第9章:通過圖片社交程序Albumy介紹用戶注冊和認證、用戶權限管理、圖片上傳與處理、用戶頭像、復雜的數(shù)據(jù)庫關系、復雜的數(shù)據(jù)庫查詢、全文搜索等內(nèi)容。 第10章:通過待辦事項程序Todoism介紹單頁應用、國際化與本地化、Web API、OAuth服務器端實現(xiàn)等內(nèi)容。 第11章:通過聊天室程序CatChat介紹Websocket應用、OAuth客戶端實現(xiàn)(第三方登錄)、Markdown支持、代碼語法高亮等內(nèi)容。 第三部分:進階篇。介紹Flask程序的部署流程,如測試、性能優(yōu)化、部署上線;介紹Flask開發(fā)的進階話題,如Flask擴展開發(fā)、Flask源碼與機制分析。 第12章:介紹Flask程序的自動化測試,包括單元測試和UI測試的編寫、計算測試覆蓋率和代碼質(zhì)量檢查。 第13章:介紹對Flask程序進行性能優(yōu)化的主要措施,包括函數(shù)與數(shù)據(jù)庫查詢的性能分析、緩存的使用、靜態(tài)文件優(yōu)化。 第14章:介紹部署Flask程序前的準備,以及部署到Linux服務器和云平臺Heroku、PythonAnywhere的完整流程。 第15章:通過擴展Flask-Share來介紹編寫Flask擴展的完整流程,從創(chuàng)建項目到上傳到PyPI。 第16章:介紹Flask的一些設計理念,包括底層WSGI的相關實現(xiàn),并對各個主要功能點進行源碼分析。 此外,書的最后還提供了附錄A,補充介紹一些Flask學習相關的資源。 閱讀前的準備 在開始我們的Flask之旅前,還有一些準備工作要做。首先,你要有一臺安裝了Python(https://www.python.org/)的電腦,并且,你要了解Python的基礎知識。 本書中所有示例程序的代碼均通過了Python 2.7和Python 3.6的測試,建議你選用這兩個版本。因為大多數(shù)Python包(包括Flask)已經(jīng)不再支持Python 2.6及以下版本,以及Python 3.3及以下版本,確保不要使用這些版本。另外,Python官方社區(qū)將于2020年1月1日停止對Python 2.的維護,這或許可以作為你選擇Python版本時的考量之一。 其次,本書有大量操作需要在命令行(CLI,Command Line Interface)下進行,所以你要熟悉你所在操作系統(tǒng)下的命令行。書中會在涉及操作系統(tǒng)特定的命令時給出提示,Windows系統(tǒng)給出的命令對應的是CMD.exe,Linux和macOS系統(tǒng)則對應的是Bash。 最后,HTML、CSS、JavaScript分別作為一個Web頁面的結構層、表現(xiàn)層和行為層,是Web開發(fā)的基礎,你需要對它們有基本的了解。任何一個Web程序都是由單個或多個Web頁面,頁面上包含的內(nèi)容,以及按鈕、表單等交互組件構成的。在本書中,我們會使用Flask操作HTML頁面;為了讓HTML頁面更加美觀,我們會使用CSS定義樣式,為了簡化編寫樣式的操作,我們會使用CSS框架,比如Bootstrap(http://getbootstrap.com/);為了讓某些操作更加合理和方便,或為了給程序增加動畫效果,我們會使用JavaScript來操作頁面元素,為了簡化編寫JavaScript的工作,我們會使用JavaScript庫jQuery(https://jquery.com/)。 在Web開發(fā)中,大部分程序離不開JavaScript,JavaScipt可以很方便、簡潔地實現(xiàn)很多頁面邏輯和功能。為了更多地介紹Flask,本書將盡量避免使用過多的JavaScipt代碼。 如果你還不熟悉這些內(nèi)容,那么可以通過下面的網(wǎng)站來快速入門: W3Schools(https://www.w3schools.com)。 MDN Web文檔(https://developer.mozilla.org/docs/Web)。 Codecademy(https://www.codecademy.com)。 使用示例程序 示例程序均使用Git來管理程序版本,為了便于大家獲取示例程序,代碼均托管在GitHub(https://github.com/)上。Git(https://git-scm.com/)是最流行的開源VCS(Version Control System,版本控制系統(tǒng)),大多數(shù)項目都使用它來追蹤文本文件(代碼)的變化。Git非常易于上手,如果你還不熟悉它,可以訪問Try Git(https://try.github.io/)來快速了解Git。 你可以訪問Git官網(wǎng)的下載頁面(https://git-scm.com/downloads)了解不同操作系統(tǒng)下Git的安裝方法,安裝成功后即可使用它來獲取示例程序。下面介紹了兩種使用示例程序的方式。 1.閱讀示例程序 因為示例程序都托管在GitHub上,所以閱讀示例程序最簡單的方式是在瀏覽器中閱讀。在對應的章節(jié),我們會給出示例程序在GitHub上的倉庫鏈接。 如果要在本地閱讀,那么首先使用git clone命令把GitHub上的示例程序克。磸椭疲┑奖镜兀员緯捻椖總}庫為例: $ git clone https://github.com/greyli/helloflask.git clone命令后面的參數(shù)是遠程Git倉庫的URL,最后的.git后綴可以省略。這里的URL中的傳輸協(xié)議使用了http(s)://協(xié)議,你也可以使用git://協(xié)議,即git://github.com/greyli/helloflask.git。 使用ls(即List)命令(Windows下使用dir命令)列出當前目錄下的文件信息,你會看到當前目錄中多了一個helloflask文件夾,這就是我們剛剛復制下來的項目倉庫。下面使用cd(即change directory)命令切換進這個文件夾: $ cd helloflask 現(xiàn)在你可以使用你喜歡的文本編輯器打開項目文件夾并準備閱讀了。建議使用輕量的文本編輯器來閱讀示例代碼,比如Atom(https://atom.io/)、Sublime Text(https://www.sublimetext.com/)或Notepad (https://notepad-plus-plus.org/)。 在對應章節(jié)的開始處都會包含從GitHub復制程序、創(chuàng)建虛擬環(huán)境并運行程序的基本步驟,你可以一邊閱讀源碼,一邊實際嘗試使用對應的程序功能。 示例程序根據(jù)章節(jié)內(nèi)容設置了對應的標簽,每個標簽都對應了一個程序版本。你可以使用git tag -n命令查看當前項目倉庫中包含的所有標簽: $ git tag -n 使用git checkout命令即可簽出對應標簽版本的代碼,添加標簽名作為參數(shù),比如: $ git checkout foo 在后面,書中會在每一次包含更改文件的章節(jié)提示應該簽出的標簽名。如果在執(zhí)行新的簽出命令之前,你對文件做了修改,那么需要使用git reset命令來撤銷改動: $ git reset --hard git reset命令會刪除本地修改,如果你希望修改示例程序源碼并保存修改,可以參考后面的改造示例程序部分。 如果你想比較兩個版本之間的變化,可以使用git diff命令,添加比較的兩個標簽作為參數(shù),比如: $ git diff foo bar 如果你想更直觀地查看版本變化,可以使用下面的命令打開內(nèi)置的Git瀏覽客戶端: $ gitk 除了內(nèi)置的Git客戶端,還有大量的第三方客戶端可以使用,詳情可以訪問https://git-scm.com/downloads/guis查看。另外,你也可以訪問GitHub的Web頁面查看不同版本(標簽)的變化,即查看某項目兩個版本之間的變化可以訪問https://github.com/用戶名/倉庫名/compare/標簽A...標簽B,比如對foo和bar標簽進行比較可以訪問https://github.com/greyli/helloflask/compare/foo...bar。 最后,你可以定期使用git fetch命令來更新本地倉庫: $ git fetch --all $ git fetch --tags $ git reset --hard origin/master 2.改造示例程序 只看菜譜是不能學會烹飪的,自己動手編寫代碼才是學習Flask最有效的途徑。你可以在閱讀示例程序的同時編寫自己的Flask程序,將書中介紹的內(nèi)容和實際的示例程序代碼作為參照。另外,你也可以創(chuàng)建一份示例程序的拷貝(派生,fork),這樣你就可以自由地修改示例程序的源碼,改造成你自己的示例程序。創(chuàng)建派生倉庫的主要步驟如下: 1)注冊一個GitHub賬號(https://github.com)。 2)訪問示例程序的GitHub倉庫頁面(比如https://github.com/greyli/helloflask),單擊右上角的Fork按鈕創(chuàng)建一個派生倉庫,如下圖所示。 創(chuàng)建派生倉庫 3) 在本地使用git clone命令復制新創(chuàng)建的派生倉庫,使用你的用戶名構建URL: $ git clone https://github.com/你的用戶名/helloflask.git 現(xiàn)在你可以在本地自由修改實例程序,并提交到你的GitHub賬戶的遠程倉庫中了。 排版約定 Windows中的命令提示符為>,而Linux或macOS中的命令提示符為$,本書中將統(tǒng)一使用美元符號(即$)作為命令提示符,比如: $ cd hello 命令提示符為三個大于號(即>>>)的表示Python Shell中輸入的代碼,比如: >>> import os $或>>>標記的文本下方?jīng)]有命令提示符的文字表示輸出的字符,不需要打出,比如: $ cat hello.txt Hello, Flask! 為了節(jié)省篇幅,本書中的代碼片段沒有嚴格遵照PEP8的約定,比如類和函數(shù)之間的空行被縮減為1行。另外,出現(xiàn)過的導入語句和無關的代碼塊會被省略掉。為了節(jié)省篇幅,代碼中重復或不相干的部分都使用三個省略號代替,比如: def do_someting(): ... if foo: return False return True 代碼、命令或URL中有時會使用<和>來標識演示內(nèi)容,在實際輸入中并不需要寫出,比如: https://github.com/<你的用戶名> 因為在示例代碼中通常會引入大量隨機字符,這些隨機字符包含下面的使用規(guī)則。 列表1:spam、ham、eggs。 列表2:foo、bar、baz、qux、quux、quuz、corge、grault、garply、waldo、fred。 人名會使用Grey Li或grey。 網(wǎng)站會使用helloflask.com或example.com。 其他需要讀者自己修改的占位字符會使用類似your_password、you_email的文本。 最后,為了盡量讓正文保持簡潔,每一章新涉及的Python庫都會在第一小節(jié)前匯總列出對應的版本和相關鏈接(比如主頁、源碼和文檔)。因為大部分項目在PyPI上提供的介紹都不夠完善,除非程序有獨立的主頁,否則會優(yōu)先使用GitHub或BitBucket上的項目頁面作為主頁。 讀者反饋與疑問 由于筆者水平有限,編寫時間也比較倉促,書中難免有錯誤或者不全面的地方,在此懇請讀者朋友批評指正。 關于本書的疑問和反饋可以到本書在GitHub上的項目倉庫HelloFlask(https://github.com/greyli/helloflask)中創(chuàng)建Issue并提交;書中的錯誤或筆誤可以修改倉庫中的勘誤文件(Errata.md)并提交Pull Request。 對于示例程序的疑問、反饋和改進建議可以到示例程序在GitHub上的項目倉庫提交Issue或Pull Request,具體的網(wǎng)址可以在對應的章節(jié)看到。 當然,你也可以直接發(fā)郵件與筆者聯(lián)系,筆者的郵箱是withlihui@gmail.com。 本書的配套資源索引可以在本書的主頁http://helloflask.com/book上看到。另外,你可以訪問筆者的博客(http://greyli.com)或是知乎專欄Hello, Flask!(https://zhuanlan.zhihu.com/flask)閱讀更多與Flask相關的文章。 致謝 首先,感謝機械工業(yè)出版社華章公司的楊福川老師和李藝老師。因為楊老師的信任,才讓筆者有幸寫作這本書。本書能夠順利完成,離不開兩位老師的悉心指導,更離不開其他編輯的辛苦工作。 其次,感謝Flask社區(qū)和其他開源項目的貢獻者們創(chuàng)造了這一切,也感謝在Stack Overflow、GitHub、Reddit和Wikipedia等網(wǎng)站貢獻知識的開發(fā)者們。 最后,感謝父母和奶奶這段時間的支持和幫助,也感謝女友魏瑤和弟弟家輝給予的鼓勵和陪伴。 李輝(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)上,你可以了解到關于他的更多信息。 前言 第一部分 基礎篇 第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)境專用的程序 實例567 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
你還可能感興趣
我要評論
|