目錄html
前言python
第1章 安裝mysql
第2章 程序的基本結構git
第3章 模板github
第4章 Web表單sql
第5章 數據庫shell
第6章 電子郵件數據庫
第7章 大型程序的結構flask
學習Python也有一個半月時間了,學到如今感受仍是初步入門階段,若是不借助網上Demo資源,幾乎不能本身寫出相關趁心的東西。目前感受本身仍是有點失敗啊,學的太慢了點。主要感受仍是本身剛開始學習時有點浮躁,一心求快,看資料時前期都是囫圇吞棗。瀏覽器
剛開始買了一本《Python基礎教程 第2版》,大約花了10天看完,初步瞭解了Python語法相關特性以及如何連接後臺數據庫。那時,看完後又買了《Python Web開發實踐》和《Flask Web開發——基於Python的Web應用開發實踐》。而後,花了5天時間把《Flask Web開發——基於Python的Web應用開發實踐》看了一遍,之因此這麼快,是由於看到了第八章時,發現代碼有點弄不懂,並且從做者GitHub上克隆下來的代碼運行還有Bug,因此選擇了快速看完了後面幾章,大概瞭解一下實現思路。而後,開始看《Python Web開發實踐》,發現這本書的要求好高啊,初學者想看懂它,花的時間沒有兩三週還搞不定(PS:主要是裏面講的注重經驗,沒有實踐項目),因而也選擇了4天時間初步瀏覽了一遍。到了這裏,我開始選擇看網絡教程,把廖雪峯老師的Python教程從基礎部分一章一章上機實踐操做了一遍(PS:最後的項目實戰沒操做),這個也差很少花了8天時間。後面又花了5天時間在網上找了幾篇高質量關於使用Flask+MySQL實現用戶登錄註冊功能的Demo。到此,感受對於Python基礎掌握的更好了一點。發現學技術,尤爲是新技術,要踏實,求穩。
因此,我選擇了從新再看一遍《Flask Web開發——基於Python的Web應用開發實踐》,並爭取把書中每個示例運行出來,若是發現Bug,就解決。在這一趟學習過程當中,發現有關Flask的中文學習資源廣泛沒有英文高,並且相關技術學習書籍都是英文版翻譯過來的。翻譯過來的問題就是,書已經出版了兩三年,有些模塊庫更新,致使書中代碼實際就不能運行,還加上做者本身當時的微小錯誤沒跟新。
本文先上傳第1章到第7章的學習實踐記錄(PS:第8-14章見《Flask Web開發——基於Python的Web應用開發實踐》一字一句上機實踐(下)),目前我也是從新學到了這裏。若是有學過Flask的前輩路過,有什麼好的學習資源推薦,不甚感激。
叨叨絮絮有點多,本文主要內容就是記載本身在學習《Flask Web開發——基於Python的Web應用開發實踐》時,上機運行相關示例遇到的坑以及一點心得體會,但願對於其餘初學Flask的同窗有點幫助。
附:《Flask Web開發——基於Python的Web應用開發實踐》做者博客、做者網絡教程版、做者本書GitHub代碼連接
本書封面
本部份內容安裝書上內容一步一步來操做,很簡單,基本不會出現問題。
注:本章主要教會初學者,如何安裝虛擬環境。使用虛擬環境一段時間後,會發現學習Python,使用虛擬環境真的是很強大,能夠避免Python解釋器中包的混亂和版本的衝突,並且還不須要依賴管理員權限。
1.書本15頁上方第二段代碼:
上圖中所示問題我特意查看了一下關於load_user()方法的調用及其做用,官方文檔寫明以下:
你須要提供一個 user_loader 回調。這個回調用於從會話中存儲的用戶 ID 從新加載用戶對象。它應該接受一個用戶的 unicode ID,並返回相應的用戶對象。 例如:
@login_manager.user_loader
def load_user(userid):
return User.get(userid)
若是 ID 無效,它應該返回 None ( 而不是拋出異常 )。(在這種狀況下,ID 會 被手動從會話中移除且處理會繼續。)
2.書本16頁左上角示例錯誤更改(PS:此處問題應該是包版本升級致使,不過做者關於該項目github上源碼已更新):
此處錯誤,在後續章節中,出現相似flask.ext.**均修改成flask_**便可。
注:經過第2章,讓我簡單瞭解了Flask框架的基本運用方式。其中關鍵在於路由和視圖函數的實現以及如何啓動服務器,難點在於請求鉤子概念的理解,我把這段概念反覆看了好幾遍,也只能理解講解的文字表面意思,關於如何運用依舊是一頭霧水。
按照書本上所述,一步一步進行操做,便可獲得以下運行結果:
此處要注意一點就是,直接從GitHub上克隆出的代碼,直接運行hello.py文件是行不通的。須要在hello.py文件最末端添加以下兩行代碼:
if __name__ == '__main__': app.run(port = 8000,debug = True)
上述代碼意思是,打開Flask自帶服務器,開啓端口是8000,且處於調試模式。
注:第3章內容沒有難點,認真看一下書上解釋,很快就能弄懂相關代碼意圖。本章重點介紹了Jinja2模板引擎的運用(PS:此處建議初學者到網上看一下Jinja2的開發文檔,加深理解),以及Flask-Bootstrap和Flask-Moment模塊的使用方法,感受全部功能都是已經寫好的,只管調用便可,很方便。
1.書本34頁示例4-2代碼更新(PS:引入包也要改爲from flask_wtf import Form,後續章節同樣):
Class wtforms.validators.DataRequired(message=None)
此驗證器將會檢測field是否輸入了數值,其實是進行了if field.data操做。而且,如數數據是一個字符串,那麼只包含空格的字符串將會被認爲是False。
參數:message-當驗證失敗時返回的錯誤消息數:message-當驗證失敗時返回的錯誤消息。
此處做者GitHub上已更新。具體應用原理能夠查看Flask-WTF開發文檔。
2.看看學習本章內容實際運行效果圖:
注:本章內容主要講解了Flask-WTF的應用,此處強烈建議初學者先看一下Flask-WTF的開發文檔,再來進行第四章的學習,這樣理解會更加深入一點,學的也會更快一點。
除此以外,還詳細介紹了重定向和用戶會話功能:主要是Post/重定向/Get模式,經過重定向實現了頁面刷新仍然能夠記住以前請求的數據,使得網頁功能更加人性化和智能化。
最後,就是Flash消息功能的應用,經過此功能結合Flask-BootStrap包,在網頁上進行相關提示操做簡直是完美。
本章節從做者GitHub上下載的代碼均是修過正的,不過書本是2014年出版,相關錯誤以及代碼更新部分需注意便可。
1.書本47頁示例5-1代碼部分有bug,按照書本後續講解進行操做會報如下錯誤:
按照報錯提示,須要在app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True該行代碼下添加以下一行代碼:app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
SQLALCHEMY_TRACK_MODIFICATIONS:若是設置成True(默認狀況),Flask-SQLAlchemy 將會追蹤對象的修改而且發送信號。這須要額外的內存, 若是沒必要要的能夠禁用它。若是你不顯示的調用它,在最新版的運行環境下,會顯示警告。
2.書本50頁5.8.1建立表,圖中顯示的操做符應該是在Mac或者Linux環境下進行的命令操做,若是是在Windows環境下,是達不到效果的,具體以下:
具體操做方法以下(WIndows版本):
此處如何要按照書本上命令達到效果,能夠參照第2章關於Flask-Scrip包的講解,設置manager變量,而後就能夠直接打開shell進行相關操做。
3.書本50頁5.8節數據庫操做部分示例運行結果
4.書本55頁示例5-5部分關於操做數據庫部分代碼有問題
此處之因此這樣修改代碼,是由於設計的數據庫角色和用戶是一對多的關係,用戶表中包含一個角色id外鍵。在對用戶表進行插入操做時,必需要確認一個用戶角色,不然沒法插入。
附運行成功頁面截圖:
5.書本57頁有關Flask-MIgrate相關配置命令如何正確實現問題
若是純粹安裝書本代碼來進行相關命令操做,會發現輸入python hello.py db init命令根本沒有輸出任何提示信息,即不能成功建立遷移倉庫。若是從做者GitHub上克隆下來的代碼,直接進行此命令操做,也是沒有任何信息提示。此處須要在hello.py文件最末端,加上以下兩行代碼(PS:做者最新修改代碼,未定義manager變量,此處須要查看第2章關於Flask-Script包講解,本身定義好manager變量):
if __name__ == '__main__': manager.run()
再去控制檯輸入相關命令,便可實現相關操做,操做成功結果以下(PS:此處推薦一篇博客文章http://www.javashuo.com/article/p-hjrcysre-t.html):
6.有關使用MySQL數據庫實現相關增刪查改操做問題
只要認真看完第5章內容,轉用MySQL數據庫實現增刪查改操做很是簡單,僅僅只須要把定義數據庫URL地址改一下就能夠,其餘部分代碼均不須要改動。具體修改以下:
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:root@localhost/test_flask' #app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(basedir,'data.sqlite')
上述代碼意思,使用用戶名和密碼均爲root的mysql數據庫帳號,進入已經建立好的test_flask數據庫,進行相關表的建立以及數據的增刪查改操做。自處能夠仔細看一下書本46頁表5-1。
注:經過本章的學習,讓我基本瞭解瞭如何使用Flask-SQLAlchemy相關功能,以及實現對關係型數據庫SQLite、MySQL的增刪查改操做,最後最重要的就是學會了使用Flask-Migrate實現數據庫遷移。爲了可以較好的理解和掌握第5章內容,建議初學者認真看一下Flask-SQLAlchemy和Flask-Migrate的官方文檔。
1.書本60頁發送郵件示例
因爲書本上使用googlemail郵箱,通常國內同窗都不會使用這個郵箱。大部分都會使用QQ郵箱吧。此處只須要把設置寫成app.config['MAIL_SERVER'] = 'smtp.qq.com',即把電子郵件服務器主機名中間的googlemail換成qq就行啦。
完成這些,若是僅僅使用本身的QQ郵箱號和QQ密碼登錄發送郵件的話,會報如下錯誤:
smtplib.SMTPSenderRefused: (503, 'Error: need EHLO and AUTH first !', u'****’...)
解決辦法(PS:此處關於QQ郵箱和登錄密碼我是直接寫在代碼裏的,沒有用環境變量獲取):
進入本身的QQ郵箱,完成以下設置操做:
發送郵件測試代碼(PS:上面獲取QQ郵箱測試登錄臨時密碼有點坑的是,發送完短信後,可能30秒後瀏覽器上開啓的QQ郵箱界面直接崩潰,不過這不要緊,崩潰後也依舊能夠發送郵件):
發送成功後的截圖:
2.關於61頁在程序中集成發送電子郵件功能
注意此處要結合第5章數據庫功能,因此前提要肯定在運行成功的頁面上可以有效地把數據插入後臺數據庫。其次,要注意的是在templates文件下要本身動手新建一個mail文件夾,並在這個文件夾裏新建new_user.txt和new_user.html兩個文本文件,這樣才能真正實現郵件發送功能。(PS:new_user.txt、new_user.html文件中內容,請查看從做者GitHub上克隆下來的代碼)
運行成功結果頁面以下(PS:此處實現功能獲取郵箱信息,我都是直接寫在代碼中的,未使用環境變量獲取):
注:本章主要講解了Flask-Mail的應用,功能應用不難,主要是涉及郵箱發送郵件時登錄須要相關服務器許可的配置問題有點麻煩。不過,總體來講,本章的應用,也從另外一方面看到了Python的魅力,簡單的幾行代碼便可實現一些比較複雜的功能。
1.書本66頁示例7-2代碼有bug
此處若是徹底按照書本上代碼,到了後續上機運行時會報如下錯誤:
E:\WorkPlace\Git_python\liu_demo\venv\lib\site-packages\flask_sqlalchemy\__init__.py:794: FSADeprecationWarning: SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and will be disabled by default in the future. Set it to True or False to suppress this warning.
此處須要添加一行代碼,以下圖:
附Flask-SQLAlchemy配置鍵相關功能定義:
SQLALCHEMY_DATABASE_URI |
用於鏈接數據的數據庫。例如:
|
SQLALCHEMY_BINDS |
一個映射綁定 (bind) 鍵到 SQLAlchemy 鏈接 URIs 的字典。 更多的信息請參閱 綁定多個數據庫。 |
SQLALCHEMY_ECHO |
若是設置成 True,SQLAlchemy 將會記錄全部 發到標準輸出(stderr)的語句,這對調試頗有幫助。 |
SQLALCHEMY_RECORD_QUERIES |
能夠用於顯式地禁用或者啓用查詢記錄。查詢記錄 在調試或者測試模式下自動啓用。更多信息請參閱 get_debug_queries()。 |
SQLALCHEMY_NATIVE_UNICODE |
能夠用於顯式地禁用支持原生的 unicode。這是 某些數據庫適配器必須的(像在 Ubuntu 某些版本上的 PostgreSQL),當使用不合適的指定無編碼的數據庫 默認值時。 |
SQLALCHEMY_POOL_SIZE |
數據庫鏈接池的大小。默認是數據庫引擎的默認值 (一般是 5)。 |
SQLALCHEMY_POOL_TIMEOUT |
指定數據庫鏈接池的超時時間。默認是 10。 |
SQLALCHEMY_POOL_RECYCLE |
自動回收鏈接的秒數。這對 MySQL 是必須的,默認 狀況下 MySQL 會自動移除閒置 8 小時或者以上的鏈接。 須要注意地是若是使用 MySQL 的話, Flask-SQLAlchemy 會自動地設置這個值爲 2 小時。 |
SQLALCHEMY_MAX_OVERFLOW |
控制在鏈接池達到最大值後能夠建立的鏈接數。當這些額外的 鏈接回收到鏈接池後將會被斷開和拋棄。 |
SQLALCHEMY_TRACK_MODIFICATIONS |
若是設置成 True (默認狀況),Flask-SQLAlchemy 將會追蹤對象的修改而且發送信號。這須要額外的內存, 若是沒必要要的能夠禁用它。 |
添加上面一行代碼後,再次去CMD進行相關命令操做,發現運行正常,結果以下:
2.書本74頁建立數據庫示例運行結果
注:第7章內容初看很簡單,不重要,可是若是不仔細看懂每個配置步驟以及相關表明含義,會發現學習後面章節,很難讀懂相關代碼。本章最重要的部分,得讀懂7.2配置選項中config.py實現配置的具體方式,以及程序是如何調用這些設置好的配置。最後,須要注意的就是學會7.4啓動腳本中manage.py代碼具體內涵,由於寫好的程序可否正常開啓服務,通常都是經過這段代碼來實現,說白了這裏原理仍是要回到第2章關於Flask-Script模塊的講解(PS:即有關使用manage.run()間接開啓系統服務)。
最後,附加一份我本身學習前7章內容上機代碼,都是按照書本上一行代碼一行手動敲進去的,出現錯誤再修改,本部分代碼和做者GitHub上最新版代碼有些許不一樣。