關(guān)于我們
書單推薦
新書推薦
|
Flask Web開(kāi)發(fā)實(shí)戰(zhàn):入門、進(jìn)階與原理解析 本書由Flask官方團(tuán)隊(duì)的開(kāi)發(fā)成員撰寫,得到了Flask項(xiàng)目核心維護(hù)者的高度認(rèn)可。 內(nèi)容上,本書從基礎(chǔ)知識(shí)到進(jìn)階實(shí)戰(zhàn),再到Flask原理和工作機(jī)制解析,涵蓋完整的Flask Web開(kāi)發(fā)學(xué)習(xí)路徑,非常全面。 實(shí)戰(zhàn)上,本書從開(kāi)發(fā)環(huán)境的搭建、項(xiàng)目的建立與組織到程序的編寫,再到自動(dòng)化測(cè)試、性能優(yōu)化,*后到生產(chǎn)環(huán)境的搭建和部署上線,詳細(xì)講解完整的Flask Web程序開(kāi)發(fā)流程,用5個(gè)綜合性案例將不同難度層級(jí)的知識(shí)點(diǎn)及具體原理串聯(lián)起來(lái),讓你在開(kāi)發(fā)技巧、原理實(shí)現(xiàn)和編程思想上都獲得相應(yīng)的提升。 技術(shù)上,不僅Flask使用的是新發(fā)布的穩(wěn)定版,而且連相關(guān)的Python工具包使用的也是全新的版本,同時(shí)對(duì)未來(lái)可能有變化的地方進(jìn)行了說(shuō)明,以此確保本書內(nèi)容在一定時(shí)間內(nèi)不會(huì)過(guò)時(shí)。 本書共16章,分為三部分。 *部分 基礎(chǔ)篇(第1~6章) 通過(guò)大量的程序?qū)嵗敿?xì)介紹了Flask的所有基礎(chǔ)知識(shí),同時(shí)在每章的后面又提供了一些進(jìn)階技巧,供進(jìn)階讀者學(xué)習(xí)。 第二部分 實(shí)戰(zhàn)篇(第7~11章) 通過(guò)5個(gè)真實(shí)的項(xiàng)目案例來(lái)串接和闡釋不同的知識(shí)點(diǎn),難度逐漸遞增。這5個(gè)案例分別為:留言板SayHello、個(gè)人博客Bluelog、圖片社交網(wǎng)站Albumy、待辦事項(xiàng)程序Todoism和聊天室CatChat。 第三部分 進(jìn)階篇(第12~16章) 首先介紹了Flask程序的部署流程:測(cè)試、性能優(yōu)化和部署上線;然后通過(guò)一個(gè)真實(shí)的實(shí)例講解了Flask擴(kuò)展的開(kāi)發(fā),*后以源代碼為切入點(diǎn)深入剖析了Flask的實(shí)現(xiàn)原理與主要工作機(jī)制。 (1)作者是Flask官方開(kāi)發(fā)團(tuán)隊(duì)成員,為Flask和其他多個(gè)Python項(xiàng)目貢獻(xiàn)源代碼,是知乎著名專欄Hello, Flask!的作者 (2)本書獲得Flask開(kāi)發(fā)團(tuán)隊(duì)核心維護(hù)者高度評(píng)價(jià) (3)內(nèi)容全面,從基礎(chǔ)知識(shí)到進(jìn)階實(shí)戰(zhàn),再到源碼分析,提供完善的Flask學(xué)習(xí)路徑; (4)實(shí)戰(zhàn)性強(qiáng),5個(gè)綜合性案例將不同難度層級(jí)的知識(shí)點(diǎn)及具體原理串聯(lián)起來(lái),讓你在開(kāi)發(fā)技巧、原理實(shí)現(xiàn)和編程思想上都獲得相應(yīng)提升; (5)技術(shù)新穎,F(xiàn)lask框架本身,以及其他相關(guān)Python框架,全部使用的是新發(fā)布的技術(shù)版本。 Flask是目前最流行的Python Web框架之一。自2010年開(kāi)源以來(lái),F(xiàn)lask受到了越來(lái)越多的Python開(kāi)發(fā)者的喜歡,其受歡迎程度不輸于Django。截至2018年6月,它在GitHub上已有近36 000個(gè)Star,2000多位Watcher,是目前GitHub中Star數(shù)最多的Python Web框架。 Flask的logo Flask的圖標(biāo)雖然看起來(lái)很像辣椒,但其實(shí)它是角狀的容器(powder horn)。 Flask僅保留了Web框架的核心,其他的功能都交給擴(kuò)展實(shí)現(xiàn)。如果沒(méi)有合適的擴(kuò)展,你甚至可以自己編寫。Flask不會(huì)替你做決定,也不會(huì)限制你的選擇。它足夠輕量,你可以只用5行就編寫出一個(gè)最簡(jiǎn)單的Web程序,但并不簡(jiǎn)陋,它能夠適應(yīng)各類項(xiàng)目的開(kāi)發(fā)。 因?yàn)镕lask的靈活性,越來(lái)越多的公司選擇Flask作為Web框架,甚至開(kāi)始從Django遷移到Flask。使用Flask的公司在國(guó)外有Netflix、Reddit、Twilio、Mailgun等,在國(guó)內(nèi)則有豆瓣、果殼、下廚房等,這說(shuō)明Flask能經(jīng)受大型項(xiàng)目的挑戰(zhàn),能夠適應(yīng)各種需求。下圖列出了部分使用Flask的公司。 你可以在StackShare上查看完整的使用Flask的公司列表(https://stackshare.io/flask)。 使用Flask的公司 在國(guó)內(nèi),越來(lái)越多的Python程序員開(kāi)始關(guān)注和學(xué)習(xí)Flask。對(duì)于國(guó)內(nèi)的程序員來(lái)說(shuō),相關(guān)書籍僅有一兩本,內(nèi)容上也過(guò)于陳舊和單薄,希望本書可以填補(bǔ)這一空白。本書提供了學(xué)習(xí)Flask的完整路徑,從基礎(chǔ)內(nèi)容到進(jìn)階實(shí)踐,再到源碼分析。同時(shí)也安排了豐富的示例程序,讓讀者可以通過(guò)親自實(shí)踐來(lái)更快地掌握Flask開(kāi)發(fā)。 Flask自2010年開(kāi)源以來(lái)在Google上的搜索趨勢(shì) 目標(biāo)讀者 在技術(shù)層面,本書適合所有Python程序員(了解Python即可)閱讀,包括已經(jīng)學(xué)習(xí)過(guò)其他Python Web框架(比如Django)的讀者和沒(méi)有接觸過(guò)Web框架的讀者。 在難度水平層面,本書適合新手以及中級(jí)讀者閱讀。新手會(huì)在這里學(xué)到Flask的基礎(chǔ)內(nèi)容,并且通過(guò)豐富、完善的實(shí)例學(xué)習(xí)Flask開(kāi)發(fā)的方方面面;中級(jí)讀者則可以通過(guò)閱讀和實(shí)踐進(jìn)階內(nèi)容來(lái)進(jìn)一步提高Flask開(kāi)發(fā)能力。 綜上所述,本書主要適合以下幾類讀者: 了解Python基本語(yǔ)法,想要自己動(dòng)手做網(wǎng)站的編程愛(ài)好者。 熟悉Python,想要從事Python Web開(kāi)發(fā)的后端工程師、運(yùn)維工程師和爬蟲(chóng)工程師。 想要從Django等其他Python Web框架轉(zhuǎn)向Flask的Python工程師。 本書主要特點(diǎn) 本書主要有三個(gè)顯著的特點(diǎn): (1)內(nèi)容全面 本書內(nèi)容覆蓋了Flask Web開(kāi)發(fā)的完整路徑:從基礎(chǔ)知識(shí)的學(xué)習(xí),到不同類型和復(fù)雜程度的程序的編寫,再到代碼的測(cè)試優(yōu)化以及Flask源碼分析;從基礎(chǔ)的內(nèi)容管理,到用戶認(rèn)證和權(quán)限管理,再到Flask與JavaScript的數(shù)據(jù)交互、Web API的編寫以及WebSocket的應(yīng)用等。 (2)實(shí)踐豐富 本書包含大量代碼片段,并附帶多個(gè)完整可運(yùn)行的示例程序。在本書第一部分的第2~6章均分別提供一個(gè)示例程序;第二部分則會(huì)通過(guò)介紹5個(gè)比較完善的Flask項(xiàng)目來(lái)講解各個(gè)方面的進(jìn)階知識(shí);在第三部分還會(huì)通過(guò)一個(gè)真實(shí)的擴(kuò)展來(lái)講解Flask擴(kuò)展開(kāi)發(fā)。通過(guò)將各類知識(shí)融入實(shí)際的項(xiàng)目開(kāi)發(fā)實(shí)踐中,可以讓你更直觀地了解具體的代碼實(shí)現(xiàn),并且快速應(yīng)用到實(shí)際開(kāi)發(fā)中。 (3)內(nèi)容最新 本書的另一個(gè)特點(diǎn)就是內(nèi)容保證最新。書中的代碼和示例程序都基于Flask最新發(fā)布的穩(wěn)定版1.0。書中涉及的其他Pyhton包和前端框架(Boostrap、Materialize等)全部使用最新版本,并且對(duì)未來(lái)可能會(huì)有的變化會(huì)加以說(shuō)明。這些特點(diǎn)可以保證書中的內(nèi)容在一定時(shí)間內(nèi)不會(huì)過(guò)時(shí)。對(duì)于其他書籍或教程中存在的關(guān)于Flask的誤區(qū),本書也會(huì)逐一糾正說(shuō)明。 除了使用的工具保持最新,本書還引入了Python和Flask開(kāi)發(fā)中的新變化,比如Flask的命令行系統(tǒng)、新的Python包管理工具(Pipenv)、新的包上傳工具(twine)、新的PyPI站點(diǎn)(https://pypi.org)、在PyPI上使用Markdown格式的README…… 本書核心內(nèi)容 本書由三部分組成,分別為基礎(chǔ)篇、實(shí)戰(zhàn)篇、進(jìn)階篇,共16章。本書章節(jié)經(jīng)過(guò)精心設(shè)計(jì),力求讓讀者可以循序漸進(jìn)地掌握Flask開(kāi)發(fā)的基礎(chǔ)知識(shí)和技巧。 第一部分:基礎(chǔ)篇。介紹Flask開(kāi)發(fā)相關(guān)的基礎(chǔ)知識(shí)。 第1章:搭建開(kāi)發(fā)環(huán)境,編寫一個(gè)最小的Flask程序并運(yùn)行它,了解Flask基本知識(shí)。 第2章:介紹Flask與HTTP的交互方式以及相關(guān)的Flask功能。 第3章:介紹Jinja2模板的使用。 第4章:介紹Web表單的創(chuàng)建和表單數(shù)據(jù)的驗(yàn)證。 第5章:介紹在Flask程序中使用數(shù)據(jù)庫(kù)進(jìn)行CRUD操作。 第6章:介紹在Flask程序中發(fā)送電子郵件的幾種方式。 第二部分:實(shí)戰(zhàn)篇。通過(guò)幾個(gè)示例程序來(lái)介紹Flask開(kāi)發(fā)中各類功能的實(shí)現(xiàn)方法和技巧。 第7章:通過(guò)一個(gè)簡(jiǎn)單的留言板程序SayHello介紹Web開(kāi)發(fā)的基本流程和基本的項(xiàng)目管理方式,對(duì)第一部分的基礎(chǔ)知識(shí)進(jìn)行簡(jiǎn)單回顧。 第8章 :通過(guò)個(gè)人博客程序Bluelog介紹CRUD操作、用戶認(rèn)證、文章評(píng)論、管理后臺(tái)等功能。 第9章:通過(guò)圖片社交程序Albumy介紹用戶注冊(cè)和認(rèn)證、用戶權(quán)限管理、圖片上傳與處理、用戶頭像、復(fù)雜的數(shù)據(jù)庫(kù)關(guān)系、復(fù)雜的數(shù)據(jù)庫(kù)查詢、全文搜索等內(nèi)容。 第10章:通過(guò)待辦事項(xiàng)程序Todoism介紹單頁(yè)應(yīng)用、國(guó)際化與本地化、Web API、OAuth服務(wù)器端實(shí)現(xiàn)等內(nèi)容。 第11章:通過(guò)聊天室程序CatChat介紹Websocket應(yīng)用、OAuth客戶端實(shí)現(xiàn)(第三方登錄)、Markdown支持、代碼語(yǔ)法高亮等內(nèi)容。 第三部分:進(jìn)階篇。介紹Flask程序的部署流程,如測(cè)試、性能優(yōu)化、部署上線;介紹Flask開(kāi)發(fā)的進(jìn)階話題,如Flask擴(kuò)展開(kāi)發(fā)、Flask源碼與機(jī)制分析。 第12章:介紹Flask程序的自動(dòng)化測(cè)試,包括單元測(cè)試和UI測(cè)試的編寫、計(jì)算測(cè)試覆蓋率和代碼質(zhì)量檢查。 第13章:介紹對(duì)Flask程序進(jìn)行性能優(yōu)化的主要措施,包括函數(shù)與數(shù)據(jù)庫(kù)查詢的性能分析、緩存的使用、靜態(tài)文件優(yōu)化。 第14章:介紹部署Flask程序前的準(zhǔn)備,以及部署到Linux服務(wù)器和云平臺(tái)Heroku、PythonAnywhere的完整流程。 第15章:通過(guò)擴(kuò)展Flask-Share來(lái)介紹編寫Flask擴(kuò)展的完整流程,從創(chuàng)建項(xiàng)目到上傳到PyPI。 第16章:介紹Flask的一些設(shè)計(jì)理念,包括底層WSGI的相關(guān)實(shí)現(xiàn),并對(duì)各個(gè)主要功能點(diǎn)進(jìn)行源碼分析。 此外,書的最后還提供了附錄A,補(bǔ)充介紹一些Flask學(xué)習(xí)相關(guān)的資源。 閱讀前的準(zhǔn)備 在開(kāi)始我們的Flask之旅前,還有一些準(zhǔn)備工作要做。首先,你要有一臺(tái)安裝了Python(https://www.python.org/)的電腦,并且,你要了解Python的基礎(chǔ)知識(shí)。 本書中所有示例程序的代碼均通過(guò)了Python 2.7和Python 3.6的測(cè)試,建議你選用這兩個(gè)版本。因?yàn)榇蠖鄶?shù)Python包(包括Flask)已經(jīng)不再支持Python 2.6及以下版本,以及Python 3.3及以下版本,確保不要使用這些版本。另外,Python官方社區(qū)將于2020年1月1日停止對(duì)Python 2.的維護(hù),這或許可以作為你選擇Python版本時(shí)的考量之一。 其次,本書有大量操作需要在命令行(CLI,Command Line Interface)下進(jìn)行,所以你要熟悉你所在操作系統(tǒng)下的命令行。書中會(huì)在涉及操作系統(tǒng)特定的命令時(shí)給出提示,Windows系統(tǒng)給出的命令對(duì)應(yīng)的是CMD.exe,Linux和macOS系統(tǒng)則對(duì)應(yīng)的是Bash。 最后,HTML、CSS、JavaScript分別作為一個(gè)Web頁(yè)面的結(jié)構(gòu)層、表現(xiàn)層和行為層,是Web開(kāi)發(fā)的基礎(chǔ),你需要對(duì)它們有基本的了解。任何一個(gè)Web程序都是由單個(gè)或多個(gè)Web頁(yè)面,頁(yè)面上包含的內(nèi)容,以及按鈕、表單等交互組件構(gòu)成的。在本書中,我們會(huì)使用Flask操作HTML頁(yè)面;為了讓HTML頁(yè)面更加美觀,我們會(huì)使用CSS定義樣式,為了簡(jiǎn)化編寫樣式的操作,我們會(huì)使用CSS框架,比如Bootstrap(http://getbootstrap.com/);為了讓某些操作更加合理和方便,或?yàn)榱私o程序增加動(dòng)畫效果,我們會(huì)使用JavaScript來(lái)操作頁(yè)面元素,為了簡(jiǎn)化編寫JavaScript的工作,我們會(huì)使用JavaScript庫(kù)jQuery(https://jquery.com/)。 在Web開(kāi)發(fā)中,大部分程序離不開(kāi)JavaScript,JavaScipt可以很方便、簡(jiǎn)潔地實(shí)現(xiàn)很多頁(yè)面邏輯和功能。為了更多地介紹Flask,本書將盡量避免使用過(guò)多的JavaScipt代碼。 如果你還不熟悉這些內(nèi)容,那么可以通過(guò)下面的網(wǎng)站來(lái)快速入門: W3Schools(https://www.w3schools.com)。 MDN Web文檔(https://developer.mozilla.org/docs/Web)。 Codecademy(https://www.codecademy.com)。 使用示例程序 示例程序均使用Git來(lái)管理程序版本,為了便于大家獲取示例程序,代碼均托管在GitHub(https://github.com/)上。Git(https://git-scm.com/)是最流行的開(kāi)源VCS(Version Control System,版本控制系統(tǒng)),大多數(shù)項(xiàng)目都使用它來(lái)追蹤文本文件(代碼)的變化。Git非常易于上手,如果你還不熟悉它,可以訪問(wèn)Try Git(https://try.github.io/)來(lái)快速了解Git。 你可以訪問(wèn)Git官網(wǎng)的下載頁(yè)面(https://git-scm.com/downloads)了解不同操作系統(tǒng)下Git的安裝方法,安裝成功后即可使用它來(lái)獲取示例程序。下面介紹了兩種使用示例程序的方式。 1.閱讀示例程序 因?yàn)槭纠绦蚨纪泄茉贕itHub上,所以閱讀示例程序最簡(jiǎn)單的方式是在瀏覽器中閱讀。在對(duì)應(yīng)的章節(jié),我們會(huì)給出示例程序在GitHub上的倉(cāng)庫(kù)鏈接。 如果要在本地閱讀,那么首先使用git clone命令把GitHub上的示例程序克。磸(fù)制)到本地,以本書的項(xiàng)目倉(cāng)庫(kù)為例: $ git clone https://github.com/greyli/helloflask.git clone命令后面的參數(shù)是遠(yuǎn)程Git倉(cāng)庫(kù)的URL,最后的.git后綴可以省略。這里的URL中的傳輸協(xié)議使用了http(s)://協(xié)議,你也可以使用git://協(xié)議,即git://github.com/greyli/helloflask.git。 使用ls(即List)命令(Windows下使用dir命令)列出當(dāng)前目錄下的文件信息,你會(huì)看到當(dāng)前目錄中多了一個(gè)helloflask文件夾,這就是我們剛剛復(fù)制下來(lái)的項(xiàng)目倉(cāng)庫(kù)。下面使用cd(即change directory)命令切換進(jìn)這個(gè)文件夾: $ cd helloflask 現(xiàn)在你可以使用你喜歡的文本編輯器打開(kāi)項(xiàng)目文件夾并準(zhǔn)備閱讀了。建議使用輕量的文本編輯器來(lái)閱讀示例代碼,比如Atom(https://atom.io/)、Sublime Text(https://www.sublimetext.com/)或Notepad (https://notepad-plus-plus.org/)。 在對(duì)應(yīng)章節(jié)的開(kāi)始處都會(huì)包含從GitHub復(fù)制程序、創(chuàng)建虛擬環(huán)境并運(yùn)行程序的基本步驟,你可以一邊閱讀源碼,一邊實(shí)際嘗試使用對(duì)應(yīng)的程序功能。 示例程序根據(jù)章節(jié)內(nèi)容設(shè)置了對(duì)應(yīng)的標(biāo)簽,每個(gè)標(biāo)簽都對(duì)應(yīng)了一個(gè)程序版本。你可以使用git tag -n命令查看當(dāng)前項(xiàng)目倉(cāng)庫(kù)中包含的所有標(biāo)簽: $ git tag -n 使用git checkout命令即可簽出對(duì)應(yīng)標(biāo)簽版本的代碼,添加標(biāo)簽名作為參數(shù),比如: $ git checkout foo 在后面,書中會(huì)在每一次包含更改文件的章節(jié)提示應(yīng)該簽出的標(biāo)簽名。如果在執(zhí)行新的簽出命令之前,你對(duì)文件做了修改,那么需要使用git reset命令來(lái)撤銷改動(dòng): $ git reset --hard git reset命令會(huì)刪除本地修改,如果你希望修改示例程序源碼并保存修改,可以參考后面的改造示例程序部分。 如果你想比較兩個(gè)版本之間的變化,可以使用git diff命令,添加比較的兩個(gè)標(biāo)簽作為參數(shù),比如: $ git diff foo bar 如果你想更直觀地查看版本變化,可以使用下面的命令打開(kāi)內(nèi)置的Git瀏覽客戶端: $ gitk 除了內(nèi)置的Git客戶端,還有大量的第三方客戶端可以使用,詳情可以訪問(wèn)https://git-scm.com/downloads/guis查看。另外,你也可以訪問(wèn)GitHub的Web頁(yè)面查看不同版本(標(biāo)簽)的變化,即查看某項(xiàng)目?jī)蓚(gè)版本之間的變化可以訪問(wèn)https://github.com/用戶名/倉(cāng)庫(kù)名/compare/標(biāo)簽A...標(biāo)簽B,比如對(duì)foo和bar標(biāo)簽進(jìn)行比較可以訪問(wèn)https://github.com/greyli/helloflask/compare/foo...bar。 最后,你可以定期使用git fetch命令來(lái)更新本地倉(cāng)庫(kù): $ git fetch --all $ git fetch --tags $ git reset --hard origin/master 2.改造示例程序 只看菜譜是不能學(xué)會(huì)烹飪的,自己動(dòng)手編寫代碼才是學(xué)習(xí)Flask最有效的途徑。你可以在閱讀示例程序的同時(shí)編寫自己的Flask程序,將書中介紹的內(nèi)容和實(shí)際的示例程序代碼作為參照。另外,你也可以創(chuàng)建一份示例程序的拷貝(派生,fork),這樣你就可以自由地修改示例程序的源碼,改造成你自己的示例程序。創(chuàng)建派生倉(cāng)庫(kù)的主要步驟如下: 1)注冊(cè)一個(gè)GitHub賬號(hào)(https://github.com)。 2)訪問(wèn)示例程序的GitHub倉(cāng)庫(kù)頁(yè)面(比如https://github.com/greyli/helloflask),單擊右上角的Fork按鈕創(chuàng)建一個(gè)派生倉(cāng)庫(kù),如下圖所示。 創(chuàng)建派生倉(cāng)庫(kù) 3) 在本地使用git clone命令復(fù)制新創(chuàng)建的派生倉(cāng)庫(kù),使用你的用戶名構(gòu)建URL: $ git clone https://github.com/你的用戶名/helloflask.git 現(xiàn)在你可以在本地自由修改實(shí)例程序,并提交到你的GitHub賬戶的遠(yuǎn)程倉(cāng)庫(kù)中了。 排版約定 Windows中的命令提示符為>,而Linux或macOS中的命令提示符為$,本書中將統(tǒng)一使用美元符號(hào)(即$)作為命令提示符,比如: $ cd hello 命令提示符為三個(gè)大于號(hào)(即>>>)的表示Python Shell中輸入的代碼,比如: >>> import os $或>>>標(biāo)記的文本下方?jīng)]有命令提示符的文字表示輸出的字符,不需要打出,比如: $ cat hello.txt Hello, Flask! 為了節(jié)省篇幅,本書中的代碼片段沒(méi)有嚴(yán)格遵照PEP8的約定,比如類和函數(shù)之間的空行被縮減為1行。另外,出現(xiàn)過(guò)的導(dǎo)入語(yǔ)句和無(wú)關(guān)的代碼塊會(huì)被省略掉。為了節(jié)省篇幅,代碼中重復(fù)或不相干的部分都使用三個(gè)省略號(hào)代替,比如: def do_someting(): ... if foo: return False return True 代碼、命令或URL中有時(shí)會(huì)使用<和>來(lái)標(biāo)識(shí)演示內(nèi)容,在實(shí)際輸入中并不需要寫出,比如: https://github.com/<你的用戶名> 因?yàn)樵谑纠a中通常會(huì)引入大量隨機(jī)字符,這些隨機(jī)字符包含下面的使用規(guī)則。 列表1:spam、ham、eggs。 列表2:foo、bar、baz、qux、quux、quuz、corge、grault、garply、waldo、fred。 人名會(huì)使用Grey Li或grey。 網(wǎng)站會(huì)使用helloflask.com或example.com。 其他需要讀者自己修改的占位字符會(huì)使用類似your_password、you_email的文本。 最后,為了盡量讓正文保持簡(jiǎn)潔,每一章新涉及的Python庫(kù)都會(huì)在第一小節(jié)前匯總列出對(duì)應(yīng)的版本和相關(guān)鏈接(比如主頁(yè)、源碼和文檔)。因?yàn)榇蟛糠猪?xiàng)目在PyPI上提供的介紹都不夠完善,除非程序有獨(dú)立的主頁(yè),否則會(huì)優(yōu)先使用GitHub或BitBucket上的項(xiàng)目頁(yè)面作為主頁(yè)。 讀者反饋與疑問(wèn) 由于筆者水平有限,編寫時(shí)間也比較倉(cāng)促,書中難免有錯(cuò)誤或者不全面的地方,在此懇請(qǐng)讀者朋友批評(píng)指正。 關(guān)于本書的疑問(wèn)和反饋可以到本書在GitHub上的項(xiàng)目倉(cāng)庫(kù)HelloFlask(https://github.com/greyli/helloflask)中創(chuàng)建Issue并提交;書中的錯(cuò)誤或筆誤可以修改倉(cāng)庫(kù)中的勘誤文件(Errata.md)并提交Pull Request。 對(duì)于示例程序的疑問(wèn)、反饋和改進(jìn)建議可以到示例程序在GitHub上的項(xiàng)目倉(cāng)庫(kù)提交Issue或Pull Request,具體的網(wǎng)址可以在對(duì)應(yīng)的章節(jié)看到。 當(dāng)然,你也可以直接發(fā)郵件與筆者聯(lián)系,筆者的郵箱是withlihui@gmail.com。 本書的配套資源索引可以在本書的主頁(yè)http://helloflask.com/book上看到。另外,你可以訪問(wèn)筆者的博客(http://greyli.com)或是知乎專欄Hello, Flask!(https://zhuanlan.zhihu.com/flask)閱讀更多與Flask相關(guān)的文章。 致謝 首先,感謝機(jī)械工業(yè)出版社華章公司的楊福川老師和李藝?yán)蠋煛R驗(yàn)闂罾蠋煹男湃,才讓筆者有幸寫作這本書。本書能夠順利完成,離不開(kāi)兩位老師的悉心指導(dǎo),更離不開(kāi)其他編輯的辛苦工作。 其次,感謝Flask社區(qū)和其他開(kāi)源項(xiàng)目的貢獻(xiàn)者們創(chuàng)造了這一切,也感謝在Stack Overflow、GitHub、Reddit和Wikipedia等網(wǎng)站貢獻(xiàn)知識(shí)的開(kāi)發(fā)者們。 最后,感謝父母和奶奶這段時(shí)間的支持和幫助,也感謝女友魏瑤和弟弟家輝給予的鼓勵(lì)和陪伴。 李輝(Grey Li) Flask官方開(kāi)發(fā)團(tuán)隊(duì)(Pallets Team)成員,知乎專欄Hello, Flask!作者,HelloFlask.com網(wǎng)站創(chuàng)建者。對(duì)Flask有非常深入的研究,熟悉它的源代碼,有豐富的項(xiàng)目經(jīng)驗(yàn)。 他熱愛(ài)分享和創(chuàng)造,曾為Flask等多個(gè)開(kāi)源項(xiàng)目貢獻(xiàn)過(guò)代碼,你可以在GitHub(github.com/greyli)上看到他的開(kāi)源活動(dòng)。在他的個(gè)人網(wǎng)站(greyli.com)上,你可以了解到關(guān)于他的更多信息。 前言 第一部分 基礎(chǔ)篇 第1章 初識(shí)Flask2 1.1 搭建開(kāi)發(fā)環(huán)境3 1.1.1 Pipenv工作流3 1.1.2 安裝Flask7 1.1.3 集成開(kāi)發(fā)環(huán)境8 1.2 Hello, Flask!11 1.2.1 創(chuàng)建程序?qū)嵗?1 1.2.2 注冊(cè)路由12 1.3 啟動(dòng)開(kāi)發(fā)服務(wù)器14 1.3.1 Run,F(xiàn)lask,Run!14 1.3.2 更多的啟動(dòng)選項(xiàng)18 1.3.3 設(shè)置運(yùn)行環(huán)境18 1.4 Python Shell20 1.5 Flask擴(kuò)展21 1.6 項(xiàng)目配置22 1.7 URL與端點(diǎn)23 1.8 Flask命令23 1.9 模板與靜態(tài)文件24 1.10 Flask與MVC架構(gòu)25 1.11 本章小結(jié)26 第2章 Flask與HTTP27 2.1 請(qǐng)求響應(yīng)循環(huán)27 2.2 HTTP請(qǐng)求29 2.2.1 請(qǐng)求報(bào)文29 2.2.2 Request對(duì)象31 2.2.3 在Flask中處理請(qǐng)求34 2.2.4 請(qǐng)求鉤子37 2.3 HTTP響應(yīng)38 2.3.1 響應(yīng)報(bào)文39 2.3.1 在Flask中生成響應(yīng)40 2.3.2 響應(yīng)格式43 2.3.3 來(lái)一塊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進(jìn)階實(shí)踐57 2.5.1 重定向回上一個(gè)頁(yè)面57 2.5.2 使用AJAX技術(shù)發(fā)送異步請(qǐng)求60 2.5.3 HTTP服務(wù)器端推送64 2.5.4 Web安全防范65 2.6 本章小結(jié)74 第3章 模板75 3.1 模板基本用法75 3.1.1 創(chuàng)建模板76 3.1.2 模板語(yǔ)法77 3.1.3 渲染模板78 3.2 模板輔助工具80 3.2.1 上下文80 3.2.2 全局對(duì)象82 3.2.3 過(guò)濾器83 3.2.4 測(cè)試器85 3.2.5 模板環(huán)境對(duì)象87 3.3 模板結(jié)構(gòu)組織88 3.3.1 局部模板88 3.3.2 宏88 3.3.3 模板繼承90 3.4 模板進(jìn)階實(shí)踐93 3.4.1 空白控制93 3.4.2 加載靜態(tài)文件94 3.4.3 消息閃現(xiàn)98 3.4.4 自定義錯(cuò)誤頁(yè)面100 3.4.5 JavaScript和CSS中的Jinja2101 3.5 本章小結(jié)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 驗(yàn)證表單數(shù)據(jù)113 4.3.3 在模板中渲染錯(cuò)誤消息117 4.4 表單進(jìn)階實(shí)踐118 4.4.1 設(shè)置錯(cuò)誤消息語(yǔ)言118 4.4.2 使用宏渲染表單120 4.4.3 自定義驗(yàn)證器121 4.4.4 文件上傳122 4.4.5 使用Flask-CKEditor集成富文本編輯器129 4.4.6 單個(gè)表單多個(gè)提交按鈕132 4.4.7 單個(gè)頁(yè)面多個(gè)表單133 4.5 本章小結(jié)137 第5章 數(shù)據(jù)庫(kù)138 5.1 數(shù)據(jù)庫(kù)的分類139 5.1.1 SQL139 5.1.2 NoSQL139 5.1.3 如何選擇?140 5.2 ORM魔法140 5.3 使用Flask-SQLAlchemy管理數(shù)據(jù)庫(kù)142 5.3.1 連接數(shù)據(jù)庫(kù)服務(wù)器142 5.3.2 定義數(shù)據(jù)庫(kù)模型144 5.3.3 創(chuàng)建數(shù)據(jù)庫(kù)和表145 5.4 數(shù)據(jù)庫(kù)操作146 5.4.1 CRUD147 5.4.2 在視圖函數(shù)里操作數(shù)據(jù)庫(kù)151 5.5 定義關(guān)系156 5.5.1 配置Python Shell上下文157 5.5.2 一對(duì)多158 5.5.3 多對(duì)一164 5.5.4 一對(duì)一165 5.5.5 多對(duì)多166 5.6 更新數(shù)據(jù)庫(kù)表168 5.6.1 重新生成表168 5.6.2 使用Flask-Migrate遷移數(shù)據(jù)庫(kù)169 5.6.3 開(kāi)發(fā)時(shí)是否需要遷移?171 5.7 數(shù)據(jù)庫(kù)進(jìn)階實(shí)踐172 5.7.1 級(jí)聯(lián)操作172 5.7.2 事件監(jiān)聽(tīng)175 5.8 本章小結(jié)177 第6章 電子郵件178 6.1 使用Flask-Mail發(fā)送電子郵件179 6.1.1 配置Flask-Mail179 6.1.2 構(gòu)建郵件數(shù)據(jù)182 6.1.3 發(fā)送郵件182 6.2 使用事務(wù)郵件服務(wù)SendGird183 6.2.1 注冊(cè)SendGird183 6.2.2 SendGrid SMTP轉(zhuǎn)發(fā)185 6.2.3 SendGrid Web API轉(zhuǎn)發(fā)185 6.3 電子郵件進(jìn)階實(shí)踐188 6.3.1 提供HTML正文188 6.3.2 使用Jinja2模板組織郵件正文189 6.3.3 異步發(fā)送郵件191 6.4 本章小結(jié)192 第二部分 實(shí)戰(zhàn)篇 第7章 留言板194 7.1 使用包組織代碼195 7.1.1 配置文件196 7.1.2 創(chuàng)建程序?qū)嵗?97 7.2 Web程序開(kāi)發(fā)流程198 7.2.1 程序功能設(shè)計(jì)199 7.2.1 前端頁(yè)面開(kāi)發(fā)200 7.2.3 后端程序開(kāi)發(fā)202 7.3 使用Bootstrap-Flask簡(jiǎn)化頁(yè)面編寫206 7.3.1 加載資源文件207 7.3.2 快捷渲染表單207 7.4 使用Flask-Moment本地化日期和時(shí)間209 7.4.1 本地化前的準(zhǔn)備209 7.4.2 使用Flask-Moment集成Moment.js209 7.4.3 渲染時(shí)間日期210 7.5 使用Faker生成虛擬數(shù)據(jù)213 7.6 使用Flask-DebugToolbar調(diào)試程序215 7.7 Flask配置的兩種組織形式216 7.7.1 環(huán)境變量?jī)?yōu)先217 7.7.2 實(shí)例文件夾覆蓋217 7.8 本章小結(jié)218 第8章 個(gè)人博客219 8.1 大型項(xiàng)目結(jié)構(gòu)220 8.1.1 使用藍(lán)本模塊化程序221 8.1.2 使用類組織配置227 8.1.3 使用工廠函數(shù)創(chuàng)建程序?qū)嵗?28 8.2 編寫程序骨架232 8.2.1 數(shù)據(jù)庫(kù)233 8.2.2 模板240 8.2.3 表單246 8.2.4 視圖函數(shù)249 8.2.5 電子郵件支持249 8.3 編寫博客前臺(tái)251 8.3.1 分頁(yè)顯示文章列表251 8.3.2 顯示文章正文258 8.3.3 文章固定鏈接259 8.3.4 顯示分類文章列表262 8.3.5 顯示評(píng)論列表263 8.3.6 發(fā)表評(píng)論與回復(fù)266 8.3.7 支持回復(fù)評(píng)論267 8.3.8 網(wǎng)站主題切換269 8.4 初始化博客271 8.4.1 安全存儲(chǔ)密碼271 8.4.2 創(chuàng)建管理員用戶273 8.5 使用Flask-Login管理用戶認(rèn)證275 8.5.1 獲取當(dāng)前用戶276 8.5.2 登入用戶277 8.5.3 登出用戶278 8.5.4 視圖保護(hù)279 8.6 使用CSRFProtect實(shí)現(xiàn)CSRF保護(hù)281 8.7 編寫博客后臺(tái)283 8.7.1 文章管理284 8.7.2 評(píng)論管理291 8.7.3 分類管理297 8.8 本章小結(jié)298 第9章 圖片社交網(wǎng)站299 9.1 項(xiàng)目組織架構(gòu)300 9.1.1 功能式架構(gòu)300 9.1.2 分區(qū)式架構(gòu)302 9.1.3 混合式架構(gòu)303 9.1.4 如何選擇303 9.2 編寫程序骨架303 9.2.1 數(shù)據(jù)庫(kù)模型與虛擬數(shù)據(jù)305 9.2.2 模板與靜態(tài)文件307 9.3 高級(jí)用戶認(rèn)證308 9.3.1 用戶注冊(cè)309 9.3.2 驗(yàn)證郵箱地址311 9.3.3 使用裝飾器過(guò)濾未確認(rèn)用戶315 9.3.4 密碼重置316 9.4 基于用戶角色的權(quán)限管理319 9.4.1 角色與權(quán)限模型319 9.4.2 設(shè)置角色與權(quán)限320 9.4.3 寫入角色與權(quán)限321 9.4.4 驗(yàn)證用戶權(quán)限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 默認(rèn)頭像335 9.6.2 生成隨機(jī)頭像335 9.7 圖片展示與管理337 9.7.1 在用戶主頁(yè)顯示圖片列表338 9.7.2 圖片詳情頁(yè)341 9.7.3 上一張下一張?zhí)D(zhuǎn)342 9.7.4 刪除確認(rèn)模態(tài)框344 9.7.5 舉報(bào)圖片346 9.7.6 圖片描述347 9.7.7 圖片標(biāo)簽349 9.7.8 用戶資料彈窗353 9.8 收藏圖片358 9.8.1 使用關(guān)聯(lián)模型表示多對(duì)多關(guān)系358 9.8.2 添加和取消收藏360 9.8.3 收藏者和收藏頁(yè)面362 9.9 用戶關(guān)注365 9.9.1 自引用多對(duì)多關(guān)系365 9.9.2 關(guān)注與取消關(guān)注366 9.9.3 顯示關(guān)注用戶列表369 9.9.4 使用AJAX在彈窗中執(zhí)行關(guān)注操作371 9.10 消息提醒378 9.10.1 提醒消息在數(shù)據(jù)庫(kù)中的表示379 9.10.2 創(chuàng)建提醒379 9.10.3 顯示和管理提醒380 9.10.4 通過(guò)輪詢實(shí)時(shí)更新未讀計(jì)數(shù)382 9.11 用戶資料與賬戶設(shè)置384 9.11.1 編輯個(gè)人資料385 9.11.2 自定義頭像386 9.11.3 更改密碼392 9.11.4 提醒消息開(kāi)關(guān)394 9.11.5 將收藏設(shè)為僅自己可見(jiàn)395 9.11.6 注銷賬戶396 9.12 首頁(yè)與探索397 9.12.1 獲取正在關(guān)注用戶的圖片399 9.12.2 使用聯(lián)結(jié)和分組查詢獲取熱門標(biāo)簽401 9.12.3 使用數(shù)據(jù)庫(kù)通用函數(shù)獲取隨機(jī)圖片402 9.13 使用Flask-Whooshee實(shí)現(xiàn)全文搜索403 9.13.1 創(chuàng)建索引404 9.13.2 搜索表單405 9.13.3 顯示搜索結(jié)果406 9.14 編寫網(wǎng)站后臺(tái)407 9.14.1 用戶管理408 9.14.2 資源管理411 9.14.3 面向管理員的用戶資料編輯412 9.15 本章小結(jié)413 第10章 待辦事項(xiàng)程序415 10.1 使用JavaScript和AJAX編寫單頁(yè)程序417 10.1.1 單頁(yè)程序的模板組織418 10.1.2 在根頁(yè)面內(nèi)切換子頁(yè)面421 10.1.3 生成測(cè)試賬戶423 10.1.4 添加新待辦條目424 10.2 國(guó)際化與本地化426 10.2.1 使用Flask-Babel集成Babel427 10.2.2 區(qū)域和語(yǔ)言427 10.2.3 文本的國(guó)際化432 10.2.4 文本的本地化433 10.2.5 時(shí)間與日期的本地化438 10.3 設(shè)計(jì)并編寫Web API440 10.3.1 認(rèn)識(shí)Web API441 10.3.2 設(shè)計(jì)優(yōu)美實(shí)用的Web API443 10.3.3 使用Flask編寫Web API446 10.3.4 使用OAuth認(rèn)證453 10.3.5 資源的序列化461 10.3.6 資源的反序列化465 10.3.7 Web API的測(cè)試與發(fā)布470 10.4 本章小結(jié)473 第11章 在線聊天室474 11.1 編寫程序骨架476 11.2 Gravatar頭像477 11.3 使用Flask-SocketIO建立實(shí)時(shí)雙向通信480 11.3.1 建立Socket.IO連接481 11.3.2 一條消息的旅程482 11.3.3 在線人數(shù)統(tǒng)計(jì)485 11.3.4 通信頻道分離486 11.4 使用Flask-OAuthlib實(shí)現(xiàn)第三方登錄489 11.4.1 編寫OAuth客戶端490 11.4.2 注冊(cè)O(shè)Auth程序491 11.4.3 處理OAuth2授權(quán)493 11.4.4 處理OAuth1授權(quán)505 11.5 聊天室功能增強(qiáng)507 11.5.1 無(wú)限滾動(dòng)加載歷史消息507 11.5.2 Markdown支持510 11.5.3 代碼語(yǔ)法高亮512 11.5.4 標(biāo)簽頁(yè)消息提醒515 11.5.5 瀏覽器桌面通知517 11.5.6 消息管理519 11.6 本章小結(jié)519 第三部分 進(jìn)階篇 第12章 自動(dòng)化測(cè)試522 12.1 認(rèn)識(shí)自動(dòng)化測(cè)試522 12.2 Flask測(cè)試客戶端523 12.3 使用unittest編寫單元測(cè)試525 12.3.1 Flask程序的測(cè)試固件525 12.3.2 編寫測(cè)試用例527 12.3.3 組織測(cè)試533 12.3.4 運(yùn)行測(cè)試535 12.4 使用Selenium進(jìn)行用戶界面測(cè)試536 12.4.1 安裝瀏覽器與驅(qū)動(dòng)537 12.4.2 準(zhǔn)備測(cè)試環(huán)境538 12.4.3 編寫測(cè)試代碼539 12.5 使用Coverage.py計(jì)算測(cè)試覆蓋率541 12.5.1 基本用法542 12.5.2 獲取測(cè)試覆蓋率543 12.6 使用Flake8檢查代碼質(zhì)量544 12.7 本章小結(jié)546 第13章 性能優(yōu)化547 13.1 程序性能分析548 13.1.1 函數(shù)性能分析548 13.1.2 數(shù)據(jù)庫(kù)查詢分析549 13.2 使用Flask-Caching設(shè)置緩存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 注冊(cè)資源集558 13.3.2 生成資源集文件559 13.3.3 在模板中加載資源集559 13.4 本章小結(jié)562 第14章 部署上線563 14.1 傳統(tǒng)部署VS云部署563 14.2 基本部署流程564 14.3 部署前的準(zhǔn)備566 14.3.1 更新程序配置566 14.3.2 創(chuàng)建生產(chǎn)環(huán)境專用的程序 實(shí)例567 14.3.3 設(shè)置遷移工具568 14.3.4 程序日志568 14.3.5 手動(dòng)導(dǎo)入環(huán)境變量572 14.3.6 HTTPS轉(zhuǎn)發(fā)572 14.4 部署到Linux服務(wù)器573 14.4.1 使用OpenSSH登錄遠(yuǎn)程主機(jī)573 14.4.2 安裝基本庫(kù)和工具574 14.4.3 安全防護(hù)措施575 14.4.4 推送代碼并初始化程序環(huán)境578 14.4.5 使用Gunicorn運(yùn)行程序579 14.4.6 使用Nginx提供反向代理580 14.4.7 使用Supervisor管理進(jìn)程584 14.4.8 更新部署后的程序586 14.5 部署到PythonAnywhere587 14.5.1 反向代理設(shè)置587 14.5.2 創(chuàng)建PythonAnywhere程序588 14.5.3 推送代碼并初始化程序環(huán)境588 14.5.4 創(chuàng)建數(shù)據(jù)庫(kù)590 14.5.5 設(shè)置虛擬環(huán)境591 14.5.6 靜態(tài)文件592 14.5.7 運(yùn)行和更新程序592 14.6 部署到Heroku594 14.6.1 通過(guò)Heroku Git部署595 14.6.2 使用GitHub部署601 14.7 下一步做什么?603 14.8 本章小結(jié)604 第15章 Flask擴(kuò)展開(kāi)發(fā)605 15.1 擴(kuò)展的命名606 15.2 擴(kuò)展項(xiàng)目骨架606 15.3 編寫擴(kuò)展類608 15.4 添加擴(kuò)展配置610 15.5 實(shí)現(xiàn)擴(kuò)展功能610 15.5.1 加載靜態(tài)資源611 15.5.2 創(chuàng)建分享組件612 15.5.3 在移動(dòng)設(shè)備上隱藏613 15.6 開(kāi)源發(fā)布前的準(zhǔn)備614 15.6.1 添加文檔字符串與注釋614 15.6.2 編寫README與文檔615 15.6.3 為打包做準(zhǔn)備616 15.6.4 編寫示例程序621 15.6.5 編寫單元測(cè)試621 15.7 發(fā)布到PyPI622 15.7.1 創(chuàng)建PyPI賬號(hào)623 15.7.2 使用setuptools打包623 15.7.3 使用twine上傳625 15.8 編寫良好的擴(kuò)展625 15.9 本章小結(jié)627 第16章 Flask工作原理與機(jī)制解析628 16.1 閱讀Flask源碼628 16.1.1 獲取Flask源碼628 16.1.2 如何閱讀源碼629 16.1.3 Flask發(fā)行版本分析637 16.2 Flask的設(shè)計(jì)理念638 16.2.1 微框架638 16.2.2 兩個(gè)核心依賴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服務(wù)器643 16.3.3 中間件644 16.4 Flask的工作流程與機(jī)制646 16.4.1 Flask中的請(qǐng)求響應(yīng)循環(huán)646 16.4.2 路由系統(tǒng)649 16.4.3 本地上下文653 16.4.4 請(qǐng)求與響應(yīng)對(duì)象665 16.4.5 session667 16.4.6 藍(lán)本674 16.4.7 模板渲染677 16.5 本章小結(jié)680 附錄A Flask資源681
你還可能感興趣
我要評(píng)論
|