內容簡介
Flask 是在Python 用戶中最為流行的Web 開發框架。《深入理解 Flask》從一個簡單的Flask 項目入手,由淺入深地探討了一系列實戰問題,包括如何使用SQLAlchemy 和Jinja 等工具進行Web 開發;如何正確地設計擴展性強的Flask 套用架構和搭建MVC 環境;對於各種NoSQL 資料庫的特性,何時應該、何時不應該及如何使用它們;通過使用Flask 擴展快速實現用戶的身份系統、RESTful API、NoSQL查詢、後台管理等功能;如何創建自己的擴展;使用Celery 編寫異步任務,使用pytest 進行單元測試等;最後介紹了如何部署上線,包括使用自己搭建的伺服器或使用各種雲服務,以及如何權衡和選擇這些不同的解決方案。
編輯推薦
Flask 是一種具有平緩學習曲線和龐大社區支持的微框架,利用它可以構建大規模的web套用。學習上手Flask非常輕鬆,但要深入理解卻並不容易。本書從一個簡單的Flask套用開始,通過解決若干實戰中的問題,對一系列進階的話題進行了探討。書中使用MVC(模型-視圖-控制器)架構對示例套用進行了轉化重構,以演示如何正確地組織套用代碼結構。有了可擴展性強的套用結構之後,接下來的章節使用Flask擴展為套用提供了額外的功能,包括用戶登錄和註冊、NoSQL查詢、REST API、一套後台管理界面,以及其他特性。然後,你會學到如何使用單元測試,保障代碼持續按照正確的方式工作,避免極具風險的猜測式編程。本書還會討論可用於部署Flask套用的諸多不同平台,以及你必須考慮的——每個平台的優劣利弊。你會從本書中學到:
■ 搭建Python項目環境的優秀實踐
■ 使用SQLAlchemy,以編程式對資料庫進行查詢
■ 在Jinja中開發頁面模板
■ 在Flask中搭建MVC環境
■ 探索NoSQL,何時應該以及何時不應該使用,以及如何使用
■ 開發你自己的Flask擴展
■ 使用Celery創建異步任務
■ 使用py.test編寫單元測試
內容提要
Flask 是在Python 用戶中最為流行的Web 開發框架。《深入理解 Flask》 從一個簡單的Flask 項目入手,由淺入深地探討了一系列實戰問題,包括如何使用SQLAlchemy 和Jinja 等工具進行Web 開發;如何正確地設計擴展性強的Flask 套用架構和搭建MVC 環境;對於各種NoSQL 資料庫的特性,何時應該、何時不應該及如何使用它們;通過使用Flask 擴展快速實現用戶的身份系統、RESTful API、NoSQL查詢、後台管理等功能;如何創建自己的擴展;使用Celery 編寫異步任務,使用pytest 進行單元測試等;最後介紹了如何部署上線,包括使用自己搭建的伺服器或使用各種雲服務,以及如何權衡和選擇這些不同的解決方案。
目錄
第1 章入門 1
使用 Git 進行版本控制 1
安裝Git 1
Git 基礎 2
使用pip 管理Python 包 4
在Windows 上安裝pip 4
在Mac OS X 和Linux 上安裝Python 包管理器pip 5
pip 基本操作 6
用virtualenv 的沙盒管理依賴 7
virtualenv 基礎 7
開始我們的項目 8
使用Flask Script 9
總結 10
第2 章使用 SQLAlchemy 創建數據模型11
設定 SQLAlchemy11
Python 安裝包 12
Flask SQLAlchemy 12
我們的第1 個數據模型 13
創建user 表 15
CRUD 16
新增數據 16
讀取數據 16
修改數據 19
刪除數據 19
數據模型之間的關聯 20
一對多 20
多對多 23
SQLAlchemy 會話對象的方便之處 25
使用Alembic 進行資料庫遷移 26
總結 28
第3 章通過模板創建視圖 29
Jinja 的語法 29
過濾器 30
注釋 34
if 語句 34
循環 35
宏 36
Flask 特有的變數和函式 37
創建視圖 38
視圖函式 38
編寫和繼承模板 41
Flask WTForms 45
WTForms 基礎 46
自定義檢驗器 48
發布評論 48
總結 51
第4 章使用藍圖創建控制器 52
請求的構建和銷毀,以及全局變數 52
錯誤頁面 53
使用類描述視圖 53
方法視圖 55
藍圖 55
總結 57
第5 章進階的套用結構 58
模組項目 58
重構代碼 59
套用的工廠模式 62
總結 64
第6 章保護套用安全 65
準備工作 65
修改用戶模型 65
創建表單 67
創建視圖 71
社交網路登錄 76
使用會話 84
使用Flask Login 87
用戶角色 90
總結 95
第7 章在 Flask 中使用NoSQL 資料庫 96
NoSQL 資料庫的種類 96
鍵值資料庫 97
文檔資料庫 97
列式資料庫 98
基於圖的資料庫 100
關係型資料庫與NoSQL 的比較 101
關係型資料庫的優勢 102
NoSQL 資料庫的優勢 103
在什麼情況下用什麼資料庫 104
在Flask 中使用MongoDB 105
安裝MongoDB 106
配置MongoEngine 106
定義文檔 107
CRUD 112
NoSQL 中的關聯關係 117
利用NoSQL 的強大能力 120
總結 126
第8 章構建 RESTful API 127
REST 是什麼 127
構建RESTful Flask API 130
GET 請求 131
格式化輸出 132
請求中的參數 135
POST 請求 138
身份認證 140
PUT 請求 143
DELETE 請求 146
總結 147
第9 章使用 Celery 編寫異步任務 148
Celery 是什麼 148
配置Celery 和RabbitMQ 150
在Celery 中創建任務 151
運行Celery 任務 154
Celery 工作流 155
監控Celery 160
在Flower 中通過網頁進行監控 161
創建一個提醒套用 161
生成每周摘要 163
總結 167
第10 章有用的 Flask 擴展 168
Flask Script 168
Flask Debug Toolbar 170
Flask Cache 173
快取函式和視圖 174
快取帶參數的函式 175
快取帶有查詢參數的路徑 177
使用Redis 作為快取後端 177
使用memcached 作為快取後端 178
Flask Assets 178
Flask Admin 181
編寫基礎管理頁面 182
編寫資料庫管理頁面 184
增強文章管理功能 185
編寫檔案系統管理頁面 187
保護Flask Admin 的安全 188
Flask Mail 189
總結 190
第11 章構建你自己的擴展 192
編寫一個 YouTube Flask 擴展 192
創建Python 包 196
通過Flask 擴展修改回響數據 198
總結 200
第12 章測試 Flask 套用 201
什麼是單元測試 201
怎樣進行測試 202
對套用進行單元測試 202
測試路由函式 203
用戶界面測試 208
測試覆蓋率 213
測試驅動的開發 216
總結 218
第13 章部署 Flask 套用 219
部署在你自己的伺服器上 219
使用fabric 把代碼推送到伺服器 220
使用supervisor 運行你的Web 伺服器 222
Gevent 224
Tornado 225
Nginx 和uWSGI 226
Apache 和uWSGI 229
部署在Heroku 上 230
使用Heroku Postgres 231
在Heroku 中使用Celery 232
在AWS 上部署套用 233
在Amazon Elastic Beanstalk 上使用Flask 233
使用Amazon Relational Database Service 235
在Amazon Simple Queue Service 中使用Celery 236
總結 237
精彩節摘
譯者序
最近才知道,Flask 在一開始竟然是作為愚人節玩笑誕生的,不過後來大受好評,並成為正式項目。我在最初接觸Flask 的時候,它也只是作為頗具先鋒氣質的“單檔案微框架”而在Python 世界被人們口口相傳。但在很短的時間內,它在Python Web 開發者中開始流行起來,Flask 社區迅速壯大,為它開發的外掛程式數量也呈爆發式增長。如今,Flask 在事實上已經成為輕量級Python Web 框架的代言人。不論是對於Python 初學者,還是對於有若干年經驗的Python 老手,使用Flask 搭建新項目都是非常有吸引力的選擇。
不過即使再優秀的工具,仍然很容易被用錯。作者在書中也反覆強調了這一點。Flask提供的是一個最小化的Web 框架,在此基礎上你可以方便地使用你最喜歡的方式,添加你最得心應手的工具,形成一個專屬於你和你的項目的高度定製化的強大工具套裝。它不會逼你自己造輪子,因為在社區里幾乎應有盡有;它也不會逼你用它附贈的輪子,因為它根本就沒有準備贈品。對老司機來說,這樣的框架可以最大程度地解放戰鬥力;對初學者來說,又可以利用社區中大量現成的資源很快上手。這樣大家便都開心了,畢竟寫程式最重要的就是開心。
但問題可能也隱藏在這裡面:老手可能會根據自己以往熟悉的方式,把強大的戰鬥力釋放在一些本來或許沒有必要重複造輪子的地方;而新手則可能犯更多的錯誤:比如使用最原始的方式或者來自其他框架的方式搭建程式結構,結果當套用規模膨脹時面臨困境;又或者引入了過多沒必要引入的Flask 擴展,導致代碼難以測試和維護,穩定性降低,甚至出現衝突。另一個潛在的問題是,龐大的社區帶來的好處毋庸多言,但如果大量地使用非官方庫,則意味著需要承擔社區開發者的水平參差不齊所帶來的風險。有個程式設計師朋友吐槽說好多Flask 擴展有個共同點,就是文檔寫得比代碼棒。總的來說,如何正確地運用框架給予的高度自由,結合具體項目的需求,在用不用擴展和使用什麼擴展之間做出最合理的選擇,則是需要一定的經驗的。而對於ORM、NoSQL、雲服務等,同樣存在用不用、用哪個、如何用的選擇難題。
在我看來,在面向業務的開發中,深入二字的含義並不是指黑科技和奇技淫巧,而是具有預見性的解決方案選擇。基於對當下項目需求的準確認知,採用最適合當前情況的不多不少的架構設計,在避免提前最佳化的同時對未來做好充分準備,對測試部署等流程的意義的深刻理解,才是深入和進階,也正是本書的重點所在。實際上本書超綱的地方有點多,探討的問題已經遠不止Flask 了。
這是我翻譯的第1 本書。翻譯這件事果然是比較特別的體驗,跟寫作和編程都很不一樣。翻譯一整本書對於像我這樣的拖延症患者來說,是個極大的挑戰,因為即使每次翻譯一大段,進度條也幾乎沒有移動的意思;但如果拖下去,它就絕對不會結束。拖到最後時刻然後突擊解決的常規辦法已經不奏效了,無論如何,經過漫長的修煉,終於還是完成了。感謝張春雨編輯邀請我翻譯本書,感謝Cookie 對我不務正業的理解和支持,感謝公孫欠扁等朋友幫我解決一些英文問題。
水平所限,翻譯中必定存在問題,請讀者見諒。我在豆瓣、Twitter、微博等處的ID 都是su27,讀後若有困惑或批評意見,歡迎找我討論、吐槽。
祝每位讀者都能從本書中獲益。珍愛生命,我用 Python!
蘇丹
2016 年6 月
作者簡介
Jack Stouffer 是一名有數年Web 套用開發經驗的程式設計師。他在兩年前將自己所有的項目都切換到了Flask,目前在位於密西根州奧本山的Apollo America 工作,使用Python、Flask 和JavaScript 編寫企業內部的業務工具。Jack 是開源技術的信徒與支持者,他在GitHub 上發布以他所推薦的最佳實踐原則編寫的Flask 範例時,該範例立即成為線上最受歡迎的Flask 代碼庫。Jack 還曾經擔任由Packt Publishing 出版的Flask FrameworkCookbook 一書的審稿人。
譯者
蘇丹,來自山城重慶,畢業於北京師範大學;現豆瓣資深開發工程師,主要開發作品有豆瓣FM等;有多年Python編程實踐經驗;曾參與《Learning Android中文版》一書翻譯。 Jack Stouffer是一位有數年web套用開發經驗的程式設計師。他在兩年前將他所有的項目都切換到了Flask。他目前在位於密西根州奧本山的Apollo America工作,使用Python、Flask和JavaScript編寫企業內部業務工具。Jack是開源技術的信徒與支持者,在GitHub上發布以他所推薦的zui佳實踐原則編寫的Flask範例時,立即成為了線上受歡迎的Flask代碼庫。Jack還曾經擔任Packt Publishing的《Flask Framework Cookbook》一書的審稿人。
前言
Flask 是一個基於Python 的Web 框架,它的設計目的是提供Web 開發所需要的最小功能子集。Flask 與別的框架(尤其是採用其他程式語言的框架)的不同之處在於:它沒有綁定諸如資料庫查詢或者表單處理等功能庫,以及它們所組成的整個生態系統。它傾向於對這些功能的實現方式不做任何限定。
這種系統帶來的主要好處是:開發者能夠使用他們想用的任何方式和工具,去設計他們的套用架構。另外,對於一些常見的通用功能,Flask 沒有以某種特定方式去實現,這意味著在Flask 中,對標準庫的使用會比在其他框架里多得多,這保證了通用功能的穩定性及針對其他Python 程式設計師的可讀性。由於Flask 社區十分龐大,所以該社區提供的添加通用功能的方式非常多。本書的重點之一,就是介紹擴展Flask 的方法,了解它們如何幫助我們避免重複造輪子。這些擴展的妙處在於,如果不需要那些額外的功能,就不用引入它們,這樣我們的套用才會保持簡潔、輕量。
這種系統的主要弊端是,大部分新的Flask 用戶不知道如何正確地規劃大型套用的結構,最後弄出一大堆讓人難以理解和維護的代碼。所以本書的另一個重點是如何為Flask 套用創建模型/視圖/控制器(MVC)架構。
MVC 體系在最初被發明時,主要用來設計桌面套用的用戶界面。它將數據處理(model)、互動邏輯(controller)和用戶界面(view)隔離成三層不同的組件。
這三層組件的隔離,使得程式設計師不用為每個網頁重新實現一遍相同的功能,而是只要重用那些代碼。比如,若是沒有把處理數據的代碼拆分到單獨的函式中,那么我們不得不在每個頁面的渲染函數裡,把同樣的資料庫連線代碼和SQL 查詢代碼都寫一遍。
本書中大量的調查研究資料及Web 套用開發中各種踩坑的第1 手痛苦經驗,使得本書成為目前關於Flask 的最詳盡、實用的資料。真誠地希望你會喜歡它。
本書涵蓋的內容
第1 章,入門,幫助讀者套用Python 項目的最佳實踐方式,並搭建一個Flask 開發環境。讀者會得到一個十分基礎的Flask 套用框架,在整本書中都會用到。
第 2 章,使用SQLAlchemy 創建數據模型,介紹如何把Python 的資料庫工具SQLAlchemy與Flask 結合起來使用,為用戶的資料庫建立一套面向對象的編程接口。
第 3 章,通過模板創建視圖,講解如何使用Flask 的模板系統Jinja,在SQLAlchemy模型的支持下動態地創建HTML 頁面。
第 4 章,使用藍圖創建控制器,介紹如何使用Flask 的藍圖(blueprint)功能來組織視圖,同時避免代碼冗餘。
第 5 章,進階的套用結構,結合在以上4 章中學到的知識,詳細講解應該如何組織代碼,以創建可維護性和可測試性都更好的套用結構。
第 6 章,保護套用安全,講解如何使用各種Flask 擴展,為每個視圖添加基於許可權的登錄系統。
第 7 章,在Flask 中使用NoSQL 資料庫,講解什麼是NoSQL 資料庫,以及在套用需要更強大的功能時,應該怎樣將NoSQL 資料庫與之整合。
第 8 章,構建RESTful API,介紹如何通過一種安全和易用的方式,把套用資料庫中的數據提供給第三方使用。
第 9 章,使用Celery 創建異步任務,講解如何把成本高或耗時長的任務挪到後台執行,讓它們不拖慢套用。
第 10 章,有用的Flask 擴展,講解如何利用一些廣受歡迎的擴展,讓套用跑得更快、增加更多的功能,以及讓調試變得方便、易行。
第 11 章,構建你自己的擴展,了解Flask 擴展是如何工作的,以及怎樣編寫擴展。
第12 章,測試Flask 套用,講解如何通過在套用中增加單元測試和用戶界面測試,以保障程式質量,減少錯誤代碼的數量。
第 13 章,部署Flask 套用,介紹如何把已經完成的套用從開發環境中拿出來,部署到線上伺服器中。
閱讀本書前需要做的準備
閱讀本書前,我們只需準備自己喜歡的一個文本編輯器和一個網頁瀏覽器。另外,需要在機器上安裝Python。
Windows、Mac OS X 和Linux 用戶都可以很容易地學習本書的內容。
本書的目標讀者
本書是為那些對Flask 有一些了解,但希望把對Flask 的理解程度從略懂提升到精通的Web 開發者所準備的。
慣例
在本書中,我們會發現存在很多不同的文本格式,這些文本格式用於傳達不同的信息。下面是一些不同的文本格式的例子,以及對這些文本格式所表達含義的解釋。
文本中的代碼關鍵字、資料庫表名、資料夾名、檔案名稱、檔案擴展名、路徑名、示例URL、用戶輸入和Twitter 用戶名會這樣顯示:
“first()和all()方法返回一個值,並且終止整個鏈式調用。”
一個代碼塊會這樣顯示:
class User(dbModel):
id = dbColumn(dbInteger(), primary_key=True)
username = dbColumn(dbString(255))
password = dbColumn(dbString(255))
posts = dbrelationship(
'Post',
backref="user",
lazy="dynamic"
)
當我們想讓代碼塊中的某些部分吸引我們的注意力時,可以將相關的行或者內容以粗體顯示:
from flaskextsqlalchemy import SQLAlchemy
app = Flask(__name__)
appconfigfrom_object(DevConfig)
db = SQLAlchemy(app)
所有命令行的輸入或輸出會這樣顯示:
$ python managepy db init
新引入的概念和重要的關鍵字以黑體顯示。在螢幕上看到的文本,比如在選單或者對話框中出現的文字,也會這樣顯示:“單擊另一個寫著下載Bootstrap 的按鈕,就會開始下載一個Zip 檔案。”
警告或者重要的說明會顯示在這樣的一個方框裡。
提示或小技巧會這樣顯示。
勘誤表
雖然我們已經盡力謹慎地確保內容的準確性,但錯誤仍然存在。如果你發現了書中的錯誤,包括正文和代碼中的錯誤,請告訴我們,我們會非常感激。這樣,你不僅幫助了其他讀者,也幫助我們改進後續的出版。如發現任何勘誤,可以在博文視點網站相應圖書的頁面提交勘誤信息。一旦你找到的錯誤被證實,你提交的信息就會被接受,我們的網站也會發布這些勘誤信息。你可以隨時瀏覽圖書頁面,查看已發布的勘誤信息。