目錄
前言
學習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代碼鏈接
本書封面
第1章 安裝
本部分內容安裝書上內容一步一步來操作,很簡單,基本不會出現問題。
注:本章主要教會初學者,如何安裝虛擬環境。使用虛擬環境一段時間后,會發現學習Python,使用虛擬環境真的是很強大,可以避免Python解釋器中包的混亂和版本的沖突,而且還不需要依賴管理員權限。
第2章 程序的基本結構
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框架的基本運用方式。其中關鍵在於路由和視圖函數的實現以及如何啟動服務器,難點在於請求鈎子概念的理解,我把這段概念反復看了好幾遍,也只能理解講解的文字表面意思,關於如何運用依舊是一頭霧水。
第3章 模板
按照書本上所述,一步一步進行操作,即可得到如下運行結果:
此處要注意一點就是,直接從GitHub上克隆出的代碼,直接運行hello.py文件是行不通的。需要在hello.py文件最末端添加如下兩行代碼:
if __name__ == '__main__': app.run(port = 8000,debug = True)
上述代碼意思是,打開Flask自帶服務器,開啟端口是8000,且處於調試模式。
注:第3章內容沒有難點,認真看一下書上解釋,很快就能弄懂相關代碼意圖。本章重點介紹了Jinja2模板引擎的運用(PS:此處建議初學者到網上看一下Jinja2的開發文檔,加深理解),以及Flask-Bootstrap和Flask-Moment模塊的使用方法,感覺所有功能都是已經寫好的,只管調用即可,很方便。
第4章 Web表單
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年出版,相關錯誤以及代碼更新部分需注意即可。
第5章 數據庫
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:此處推薦一篇博客文章https://www.cnblogs.com/caicairui/p/7821586.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的官方文檔。
第6章 電子郵件
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的魅力,簡單的幾行代碼即可實現一些比較復雜的功能。
第7章 大型程序的結構
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上最新版代碼有些許不同。