Python3.5+Mongodb+Flask Web實戰坑點小結【Dog Plus】

我不是程序員,也不是設計師,我只是碰巧有一些想法和一台電腦。

I am not a designer nor a coder. Im just a guy with a point-of-view and a computer.

寫在前言前:

第一個WEB部署完畢,覺得有必要做一個小結:

開發平台及工具:Win10+Pycharm+Py3.5+Flask+Mongodb

回頭看看,一旦選擇這樣的套裝就註定要有很多坑來填。建議後來者能用Linux就別用Win系。

接下來我根據目錄想到那寫哪,以【注】的形式標示,隨便搜一下,你都可以下載到該書的電子版和源代碼。

  第一部分 Flask簡介

  第1章 安裝 3

  1.1 使用虛擬環境 4

【注】不管在開發環境還是生產環境,虛擬環境一定要配置好,除非你打算就只用Python開發一個項目WEB,將各種包混裝在一起,也方便包與包之間相互打招呼。

  1.2 使用pip安裝Python包 6

【注】Requirement.txt包含各個包的版本信息,部署的時候最好和開發的時候一致,當然Python的版本更應該如此。不然,也許突然就會遇到一個未知的BUG,讓你抓狂。

  第2章 程序的基本結構 7

  2.1 初始化 7

  2.2 路由和視圖函數 7

  2.3 啟動伺服器 9

  2.4 一個完整的程序 9

  2.5 請求-響應循環 11

【注】該節放在這裡讓初學者很容易忽視掉,尤其是對於請求上下問的理解。整個Flask擼碼的過程就是圍繞著參數傳遞,在理解這一節的時候一定要記得Python萬法皆對象,會爆出很多淫蕩的參數傳遞方法。

  2.5.1 程序和請求上下文 11

  2.5.2 請求調度 13

  2.5.3 請求鉤子 13

  2.5.4 響應 14

  2.6 Flask擴展 15

  第3章 模板 19

  3.1 Jinja2模板引擎 19

【注】Jinja2作為模版的核心,控制結構的用法基本和Python相同,但是要注意靈活運用通道,在模版處理參數,傳遞參數(Url_for、Request.endpoint)。jinja在讀取字典和列表的時候和Python略有差異。

  3.1.1 渲染模板 20

  3.1.2 變數 21

  3.1.3 控制結構 22

  3.2 使用Flask-Bootstrap集成Twitter Bootstrap 23

【注】我自己使用菜鳥教程中的Bootstrap,最好先看看別人的模版組成,了解container、rows、col,以及一些標籤的用法。CSS和JS簡單看一點就行,遇到再解決,時刻記得我們有搜索引擎,相信別人比自己聰明。

  3.3 自定義錯誤頁面 26

  3.4 鏈接 29

  3.5 靜態文件 29

  3.6 使用Flask-Moment本地化日期和時間 30

  第4章 Web表單 33

【注】該章整體偏單薄,前後台的交互很多時候就是以表單的形式來展現,缺陷在於多個表單請求、個性化表單的設置,以及表單提交之後不重定向會產生什麼後果,都沒有表述清楚。@李輝

4.1 跨站請求偽造保護 33

  4.2 表單類 34

  4.3 把表單渲染成HTML 35

  4.4 在視圖函數中處理表單 37

  4.5 重定向和用戶會話 39

  4.6 Flash消息 41

  第5章 資料庫 43

【注】一開始準備用SQL,也用它實現了註冊,由於最終的目標是數據分析,怎麼能少了MongoDB,靈活添加數據,地理位置信息處理,和Pandas的基情。當花大力氣學習Mongo的時候,卻不知道後面有一個大坑在等著,差點讓我放棄WEB採用Mongo初衷。

  5.1 SQL資料庫 43

  5.2 NoSQL資料庫 44

  5.3 使用SQL還是NoSQL 45

  5.4 Python資料庫框架 45

  5.5 使用Flask-SQLAlchemy管理資料庫 46

  5.6 定義模型 47

  5.7 關係 49

  5.8 資料庫操作 50

  5.8.1 創建表 50

  5.8.2 插入行 51

  5.8.3 修改行 52

  5.8.4 刪除行 52

  5.8.5 查詢行 52

  5.9 在視圖函數中操作資料庫 54

  5.10 集成Python shell 56

  5.11 使用Flask-Migrate實現資料庫遷移 56

  5.11.1 創建遷移倉庫 57

  5.11.2 創建遷移腳本 57

  5.11.3 更新資料庫 58

  第6章 電子郵件 59

【注】該節完全可以拿來使用,亮點在於非同步(多線程)處理上,當初學爬蟲的時候,這個多線程、多進程、進程池卡了很久才一知半解。其實在這裡還有一個Idea拿出來分享,有興趣的可以操作:免費郵箱分享,根據會員當日可提供有用郵箱發送數量作為會員的積分,積分可以用來兌換相應數量的郵件發送量,這樣就可以實現大量郵件免費群發的目的。

  6.1使用Flask-Mail提供電子郵件支持 59

  6.2在Python shell中發送電子郵件 60

  6.3在程序中集成發送電子郵件功能 61

  6.4非同步發送電子郵件 62

  第7章 大型程序的結構 65

  7.1 項目結構 65

  7.2 配置選項 66

  7.3 程序包 67

  7.3.1 使用程序工廠函數 68

  7.3.2 在藍本中實現程序功能 69

【注】藍本類似我們土木界的藍圖,不同單體建築採用不同的圖紙,不同功能的區域採用不同的圖紙,修建到那個階段用那個階段的圖紙,還可以邊設計邊施工。直白點就是把WEB網站功能容器化。細想Grid、Container、Blueprint、Class、Function、Docker都有相通之處。

  7.4 啟動腳本 71

  7.5 需求文件 71

  7.6 單元測試 72

  7.7 創建資料庫 74

【注】Mongodb的優勢就在這裡體驗,不用預定義數據類型,想到的時候再加入,當然這一點再部署的時候可能出現讓人困惑的錯誤。因此,即便用Mongodb的時候也儘可能按SQL的規範化預定義數據及類型,其次insert的速度要比update快很多。

  第二部分 實例:社交博客程序

  第8章 用戶認證 77

  8.1 Flask的認證擴展 77

  8.2 密碼安全性 77

  8.3 創建認證藍本 80

  8.4 使用Flask-Login認證用戶 81

【注】採用Mongodb最大的痛在這裡,因為Flask-Login並沒有支持非關係型資料庫,對於初學者來說,要先理解這貨的實現過程,也是一個痛苦的事情。好在有一篇中文和英文的參考文章可以借鑒。自行搜索Flask Mongodb。在這裡停止了半個月的進程,說多了都是淚。

  8.4.1 準備用於登錄的用戶模型 81

  8.4.2 保護路由 83

  8.4.3 添加登錄表單 83

  8.4.4 登入用戶 84

  8.4.5 登出用戶 86

  8.4.6 測試登錄 86

  8.5 註冊新用戶 87

  8.5.1 添加用戶註冊表單 87

  8.5.2 註冊新用戶 89

  8.6 確認賬戶 90

  8.6.1 使用itsdangerous生成確認令牌 90

【注】這是一個很有用的東西,用來理解和實現Token很有幫助,甚至可以隱藏一些地址,或者限制地址的有效訪問時間,可以間接的阻擋低級爬蟲。道高一尺魔高一丈,其實一但用了selenium或無頭瀏覽器,爬一個網站也就是效率的問題,幾乎沒有爬不到的數據,只有爬不到蟲。

  8.6.2 發送確認郵件 92

  8.7 管理賬戶 95

  第9章 用戶角色 97

  9.1 角色在資料庫中的表示 97

  9.2 賦予角色 99

  9.3 角色驗證 100

【注】直接在資料庫中定義role,然後在相應的功能區域進行鑒權操作。麻煩了點,但是靈活,靈活不就是Flask的精髓嘛,要不去學Django

  第10章 用戶資料 103

  10.1 資料信息 103

  10.2 用戶資料頁面 104

  10.3 資料編輯器 106

  10.3.1 用戶級別的資料編輯器  106

  10.3.2 管理員級別的資料編輯器 108

  10.4 用戶頭像 110

【注】當採用SSLify時候,注意圖像顯示、郵箱驗證的時候要分別處理http和https兩種情況。

  第11章 博客文章 115

  11.1 提交和顯示博客文章 115

  11.2 在資料頁中顯示博客文章 118

  11.3 分頁顯示長博客文章列表 118

  11.3.1 創建虛擬博客文章數據 119

  11.3.2 在頁面中渲染數據 120

  11.3.3 添加分頁導航 121

【注】又是一個讓Mongodb初級用戶惱火的地方,好在mongo有Skip函數可以有效處理分頁。同樣和表單提交一樣,如何在一個頁面內實現兩個分頁導航,就需要分析分頁導航的代碼,然後再手動實現,另,結合個著bootstrap進行理解,可能會更快一些。

  11.4 使用Markdown和Flask-PageDown支持富文本文章 124

  11.4.1 使用Flask-PageDown 124

  11.4.2 在伺服器上處理富文本 125

【注】我沒有用該文本編輯器,用的tinymce,可惜math模塊沒有配置成功,略帶遺憾。誰能教教我用試用我乎的G編輯器的方法?

  11.5 博客文章的固定鏈接 127

  11.6 博客文章編輯器 128

  第12章 關注者 131

【注】Mongdb的優勢就是隨時插入使用者關係,用到的時候再find,可能速度上會遜色一點(ms),何況速度對我們並不重要,呵呵。

  12.1 再論資料庫關係 131

  12.1.1 多對多關係 131

  12.1.2 自引用關係 133

  12.1.3 高級多對多關係 134

  12.2 在資料頁中顯示關注者 136

  12.3 使用資料庫聯結查詢所關注用戶的文章 138

  12.4 在首頁顯示所關注用戶的文章 141

  第13章 用戶評論 145

  13.1 評論在資料庫中的表示 145

  13.2 提交和顯示評論 146

  13.3 管理評論 149

  第14章 應用編程介面 153

【注】由於我的網站暫時不需要API借口,等需要和微信、支付勾搭的時候再看相關認證。

  14.1 REST簡介 153

  14.1.1 資源就是一切 154

  14.1.2 請求方法 154

  14.1.3 請求和響應主體 155

  14.1.4 版本 156

  14.2 使用Flask提供REST Web服務 156

  14.2.1 創建API藍本 157

  14.2.2 錯誤處理 157

  14.2.3 使用Flask-HTTPAuth認證用戶 159

  14.2.4 基於令牌的認證 161

  14.2.5 資源和JSON的序列化轉換 162

  14.2.6 實現資源端點 165

  14.2.7 分頁大型資源集合 167

  14.2.8 使用HTTPie測試Web服務 168

  第三部分 成功在望

  第15章 測試 173

【注】整個視圖層的代碼加起來三千行,按部就班測試也就幾秒,也想知道值得測試嗎?

  15.1 獲取代碼覆蓋報告 173

  15.2 Flask測試客戶端 176

  15.2.1 測試Web程序 176

  15.2.2 測試Web服務 179

  15.3 使用Selenium進行端到端測試 180

  15.4 值得測試嗎 184

  第16章 性能 185

  16.1 記錄影響性能的緩慢資料庫查詢 185

【注】Mongodb試用的時候就儘可能一次調用,多次使用。但是在某些特定的環境下,游標只能使用一次,然後就失效了,就需要重新定義。

  16.2 分析源碼 187

  第17章 部署 189

  17.1 部署流程 189

  17.2 把生產環境中的錯誤寫入日誌 190

  17.3 雲部署 191

【注】我用Centos7.2,二馬之一的,稍後會專門寫寫部署,在win平台之下文件夾的大小寫、甚至空格是會被系統處理的,但是Linux太嚴謹,甚至某一些路徑中不能包含中文,哥華麗的用拼音了。在我的網站中英文和拼音的混搭也成了時尚,擦!

對了,用gunicorn你不會後悔,至於進程守護,還沒有找到很好的方法,有誰知道Centos7.2+Python3.5.2用什麼守護神?求教!

  17.4 Heroku平台 191

  17.4.1 準備程序 192

  17.4.2 使用Foreman進行測試 196

  17.4.3 使用Flask-SSLify啟用安全HTTP 197

  17.4.4 執行git push命令部署 198

  17.4.5 查看日誌 199

  17.4.6 部署一次升級 199

  17.5 傳統的託管 200

  17.5.1 架設伺服器 200

  17.5.2 導入環境變數 200

  17.5.3 配置日誌 201

  第18章 其他資源 203

  18.1 使用集成開發環境 203

  18.2 查找Flask擴展 204

  18.3 參與Flask開發 204

嘿嘿,隨便寫寫,具體的坑在我的小站內已經有相關的資料,接下來朝著數據分析進軍,pandas、scikit-learn,plotly我又回來了!

(一)2016年終小結之Python學習

(二)Python3.5+Mongodb+Flask Web實戰坑點小結【Dog Plus】

(三)CentOS7.2+Python3.5+Flask部署標準化配置流程

(四)CentOS+MongoDB V3.4.0 安裝

推薦閱讀:

有一點 Python 與 SQL 基礎,想學習開發網站,Django,Karrigell,Webpy 這 3 個哪個更加適合我呢?
Flask文件上傳(二):使用擴展實現
上雲連載5:使用 Nginx + uWSGI 部署 Flask 應用

TAG:Python | Flask | MongoDB |