深入理解Flask

深入理解Flask

《深入理解Flask》是2016年7月電子工業出版社出版的圖書,作者是【美】Jack Stouffer(傑克·史都華)。

內容簡介

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 檔案。”

警告或者重要的說明會顯示在這樣的一個方框裡。

提示或小技巧會這樣顯示。

勘誤表

雖然我們已經盡力謹慎地確保內容的準確性,但錯誤仍然存在。如果你發現了書中的錯誤,包括正文和代碼中的錯誤,請告訴我們,我們會非常感激。這樣,你不僅幫助了其他讀者,也幫助我們改進後續的出版。如發現任何勘誤,可以在博文視點網站相應圖書的頁面提交勘誤信息。一旦你找到的錯誤被證實,你提交的信息就會被接受,我們的網站也會發布這些勘誤信息。你可以隨時瀏覽圖書頁面,查看已發布的勘誤信息。

相關詞條

相關搜尋

熱門詞條

聯絡我們