Flask 入門指南

Gevin發表於2016-04-15

Get Started With Flask

1. 初識Flask

Flask 是一個微框架(Micro framework),其官方文件的前言部分對Flask做了很清楚的定性介紹:

“微”(Micro)是什麼意思?

“微”(micro) 並不意味著你要把整個web應用放到一個python檔案裡(雖然確實可以),也不意味著Flask 在功能上有所欠缺。微框架中的“微”意味著 Flask 旨在保持核心功能的簡單而易於擴充套件。Flask 不會替你做出太多決策,比如使用何種資料庫。而那些 Flask 幫你做好的決策(比如使用哪種模板引擎),都是很容易替換。除此之外的一切都由可由你掌握。

預設情況下,Flask 不包含資料庫抽象層、表單驗證,或是任何已在其它已庫中處理的很好的功能。相反,Flask 支援透過擴充套件來給應用新增這些功能,如同是 Flask 本身實現的一樣。眾多的擴充套件提供了資料庫整合、表單驗證、上傳處理及各種各樣的開放認證技術等功能。Flask 也許是“微小”的,但它已準備好在複雜的生產環境中投入使用。

Flask儘量避免重複製造輪子,而是與已有的優秀輪子去結合,這使得Flask靈活、強大,且定製性更強。 Flask 配置選項眾多,均設定了合理的預設值,並會遵循一些慣例;配置選項均可以修改,但通常沒必要修改,尤其是剛開始的時候。這使得Flask易於上手。

2. Flask VS Django

Django和Flask是GitHub上star數量最多的2個Python web框架,網上也有很多文章對這兩個web框架進行分析和對比,如:

Flask和Django各有優劣,Gevin最初是基於Django做開發的,後來轉向Flask,目前兩個框架都在使用,就我個人而言,我對這兩個框架比較如下:

(1)Flask

  • Flask確實很“輕”,不愧是Micro Framework,從Django轉向Flask的開發者一定會如此感慨,除非二者均未深入使用過
  • Flask自由、靈活,可擴充套件性強,第三方庫的選擇面廣,開發時可以結合自己最喜歡用的輪子,也能結合最流行最強大的Python庫
  • 入門簡單,即便沒有多少web開發經驗,也能很快做出網站
  • 非常適用於小型網站
  • 非常適用於開發web服務的API
  • 開發大型網站無壓力,但程式碼架構需要自己設計,開發成本取決於開發者的能力和經驗
  • 各方面效能均等於或優於Django
  • Django自帶的或第三方的好評如潮的功能,Flask上總會找到與之類似第三方庫
  • Flask靈活開發,Python高手基本都會喜歡Flask,但對Django卻可能褒貶不一
  • Flask與關係型資料庫的配合使用不弱於Django,而其與NoSQL資料庫的配合遠遠優於Django
  • Flask比Django更加Pythonic,與Python的philosophy更加吻合

(2)Django

  • Django太重了,除了web框架,自帶ORM和模板引擎,靈活和自由度不夠高
  • Django能開發小應用,但總會有“殺雞焉用牛刀”的感覺
  • Django的自帶ORM非常優秀,綜合評價略高於SQLAlchemy
  • Django自帶的模板引擎簡單好用,但其強大程度和綜合評價略低於Jinja
  • Django自帶ORM也使Django與關係型資料庫耦合度過高,如果想使用MongoDB等NoSQL資料,需要選取合適的第三方庫,且總感覺Django+SQL才是天生一對的搭配,Django+NoSQL砍掉了Django的半壁江山
  • Django目前支援Jinja等非官方模板引擎
  • Django自帶的資料庫管理app好評如潮
  • Django非常適合企業級網站的開發:快速、靠譜、穩定
  • Django成熟、穩定、完善,但相比於Flask,Django的整體生態相對封閉
  • Django是Python web框架的先驅,使用者多,第三方庫最豐富,最好的Python庫,如果不能直接用到Django中,也一定能找到與之對應的移植
  • Django上手也比較容易,開發文件詳細、完善,相關資料豐富

就我個人而言,雖然我最初選擇的Python web框架是Django,但當我開始研究Flask後,Flask就立刻成為我最喜歡的框架,雖然有時基於Flask做開發時會借鑑Django上的一些優點,但Flask的地位卻無可動搖。

另外,我記得Django的開發者曾經說過,Django出現的太早了,Flask才是Django最初預期的樣子,箇中意思,請自己品味,原文原話,我暫時沒有找到,如果有朋友看到原話,麻煩給個連結。

3. Flask從入門到精通

3.1 Flask入門

Flask上手非常容易,僅僅看完Flask官方文件中的Quickstart部分,就可以實現簡單的網站了。當然,網站看起來好不好,與html, CSS和js水平有關,這不在Flask的使用範圍之內。

接下來就Quickstart章節的內容做一點解釋。

文中一開始就指明瞭,以下簡單幾行程式碼,即可拉起一個網站:

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello World!'

if __name__ == '__main__':
    app.run()

簡言之,只要建立一個Flask的例項(如上面的app),呼叫run()方法,網站即被拉起。 @app.route('/')設定網站的url路由,下面的函式實現了訪問該url時要執行的功能。僅基於以上簡單程式碼承載的邏輯,即可把任一個python 庫的功能轉換成網站或簡單的web api,如果想開放RESTful API,基於這個邏輯從零開始做完成沒有問題,雖然更好的方式是基於RESTful相關第三方庫。隨著網站的功能的增加,程式碼的行數也會劇增,這時所有的程式碼都放到一個檔案中會很難管理,因此,Flask雖然一個檔案就可以實現一個網站,但即便做一個小型網站,最好的方式也是將不同的邏輯放到不同的檔案中,檔案的組織方式隨個人喜好而定,可以借鑑他人優秀的程式碼,也可以自己摸索。

做一個網站,最基本的功能莫過於資訊/錯誤的返回,頁面的渲染,靜態檔案的載入,URL構建,session/cookie的使用,request/response的處理等,這些在Quickstart中都有涉及,掌握這些內容,做簡單網站就足夠了,即入門從Quickstart著手即可。

3.2 Flask精通

若要精通Flask,僅僅透過Quickstart快速入門完全不夠,那怎樣才能把Flask用好呢?用好Flask沒什麼特殊的捷徑,靠的依然是『多使用、多思考、多看他人優秀的程式碼』,經驗可能是程式設計世界裡最恰當稱之為掌握新技術的捷徑的東西,而經驗的積累卻又是一個漫長的過程,靠的也是『多使用、多思考、多看他人優秀的程式碼』。Flask的精通要靠自己努力,優秀的資料可以分享。我在這裡推薦幾個我覺得不錯的資料,歡迎大家補充。

(1) Flask官方文件

Flask官方文件寫的還是相當不錯的,作為學習Flask的第一手資料沒有問題,且Flask官方的Snippets,對開發很有幫助,也能避免開發者花太多時間考慮重複的輪子如何開發

(2) Flask Web開發

這本書相當不錯,透過這本書的學習,基本能做到Flask從入門到精通,也是我建議的第一手Flask學習資料。書中介紹的Flask構建大型專案的架構方式,很是受用,很有實際意義。

(3) miguelgrinberg.com

上面圖書作者的部落格,是積累Flask開發經驗的好資料

(4) Write a Tumblelog Application with Flask and MongoEngine

這是MongoDB官方文件中的一個教程,也是學習Flask開發的一個很好案例,尤其適合Flask+MongoDB開發的應用場景

(5) Flask 原始碼

Flask 本身是一個非常優秀的Python庫,閱讀其原始碼對理解Flask及提高Python開發水平非常有幫助。

(6) The Hitchhiker’s Guide to Python!

這個資料雖然不直接與Flask有關,但對初學者,絕對有學習的價值

4. Flask與資料庫

大部分網站都要用資料庫軟體來儲存資料,資料庫對於任何應用而言都是舉足輕重的,因此本節將Flask與資料庫的配合作為一個專題展開討論。

Flask與資料庫直連來存取資料雖然沒有問題,但會使應用與資料庫緊耦合,不利於擴充套件,也會增加維護程式碼邏輯的工作量。使用資料庫抽象層,會簡化Flask與資料庫互動的邏輯,也使得Flask與資料庫互動的邏輯轉移到資料庫抽象層搞定,使業務邏輯更清晰,開發也更專注。由於Flask是Micro Framework,自身沒有資料庫抽象層,而Python生態下有非常多的資料庫抽象層可供使用,對Flask而言option非常多,開發者可以選擇最好的或自己最熟悉的資料庫抽象層應用於開發。

接下來列舉一些我熟悉或使用過的資料庫抽象層。

4.1 適用於關係型資料庫的資料庫抽象層

適用於關係型資料庫的資料庫抽象層及ORM(Object Relation Mapping),適用於Flask有:

4.2 適用於NoSQL資料庫的資料庫抽象層

NoSQL資料庫非常多,MongoDB是其中一種文件型的NoSQL資料庫,由於MongoDB天生就是為網際網路開發服務的,而我只用Flask + MongoDB 做過開發,下面僅列出MongoDB的抽象層:

5. Flask 常用庫

一個強大的框架不僅要練好自己的內功,還要具備各種趁手的武器和裝備。Flask 易於擴充套件,為自己營造了優秀的生態環境,Flask生態下有各種各樣的第三方庫可供使用,這讓我們開發自己的應用時,更高效、更專注,也更穩定。

下面列舉一些我常用或瞭解的庫,作為入門,熟悉了這些庫,應該很容易開發一個健壯強大的應用了。

5.1 Flask 常用庫列表

5.2 Flask 常用庫詳情

flask-script

為Flask提供強大的命令列操作,與Django shell類似。

flask-login

Flask user session 管理,提供諸如login_user, logout_user, login_required, current_user等功能,也是其他很多Flask庫的基礎。

flask-admin

為Flask應用提供操作簡單且易於擴充套件的資料庫管理介面,與Django自帶的資料庫管理app類似。

Flask-WTF

Flask與WTForms的整合,提供強大的Form安全和校驗機制,與Django內建的Form功能類似。

flask-principal

Flask強大的許可權管理機制,靈活性強,提供了一個許可權管理的基礎框架,是很多Flask許可權相關擴充套件的基礎。

flask-restful

一個強大的Flask RESTful框架,簡單好用。

flask-api

相當於Django REST Framework的Flask版,是另一個強大的Flask RESTful框架。

Flask-Mail

Flask-Mail 為Flask應用新增了SMTP 郵件傳送功能

Flask-User

Flask-User整合了使用者管理相關功能,並允許對功能做定製性修改,其相關功能包括Register, Confirm email, Login, Change username, Change password, Forgot password等。

Flask-User 基於Flask-SQLAlchemy,NoSQL資料庫無法使用。

flask-security

Flask-Security讓開發者能夠很快的為應用新增常用的安全機制,其整合了Flask-Login, Flask-Mail, Flask-Principal, Flask-Script等應用。其安全機制包括:

  • Session based authentication
  • Role management
  • Password encryption
  • Basic HTTP authentication
  • Token based authentication
  • Token based account activation (optional)
  • Token based password recovery / resetting (optional)
  • User registration (optional)
  • Login tracking (optional)
  • JSON/Ajax Support

flask-babel

Flask國際化和本地化擴充套件,基於Babel

flask-locale

為Flask應用新增語言包,與flask-babel類似。

6. 最後

我個人對Flask的研究,也基本上是按本文思路一步步展開的,希望對初學Flask的朋友有所幫助。關於Flask或者Python的學習,再補充一點,開發Flask第三方庫,或者完善已有的Flask庫,也是一種很好的實踐方法。

歡迎大家與我交流Flask的使用。


注:轉載本文,請與Gevin聯絡




如果您覺得Gevin的文章有價值,就請Gevin喝杯茶吧!

|

歡迎關注我的微信公眾賬號

Flask 入門指南