本文首發於Gevin的博客html
原文連接:Flask 入門指南python
未經 Gevin 受權,禁止轉載git
Flask 是一個微框架(Micro framework),其官方文檔的前言部分對Flask作了很清楚的定性介紹:github
「微」(Micro)是什麼意思?
「微」(micro) 並不意味着你要把整個web應用放到一個python文件裏(雖然確實能夠),也不意味着Flask 在功能上有所欠缺。微框架中的「微」意味着 Flask 旨在保持核心功能的簡單而易於擴展。Flask 不會替你作出太多決策,好比使用何種數據庫。而那些 Flask 幫你作好的決策(好比使用哪一種模板引擎),都是很容易替換。除此以外的一切都由可由你掌握。web
默認狀況下,Flask 不包含數據庫抽象層、表單驗證,或是任何已在其它已庫中處理的很好的功能。相反,Flask 支持經過擴展來給應用添加這些功能,如同是 Flask 自己實現的同樣。衆多的擴展提供了數據庫集成、表單驗證、上傳處理及各類各樣的開放認證技術等功能。Flask 也許是「微小」的,但它已準備好在複雜的生產環境中投入使用。sql
Flask儘可能避免重複製造輪子,而是與已有的優秀輪子去結合,這使得Flask靈活、強大,且定製性更強。 Flask 配置選項衆多,均設置了合理的默認值,並會遵循一些慣例;配置選項都可以修改,但一般不必修改,尤爲是剛開始的時候。這使得Flask易於上手。mongodb
Django和Flask是GitHub上star數量最多的2個Python web框架,網上也有不少文章對這兩個web框架進行分析和對比,如:shell
Flask和Django各有優劣,Gevin最初是基於Django作開發的,後來轉向Flask,目前兩個框架都在使用,就我我的而言,我對這兩個框架比較以下:數據庫
(1)Flaskdjango
(2)Django
就我我的而言,雖然我最初選擇的Python web框架是Django,但當我開始研究Flask後,Flask就馬上成爲我最喜歡的框架,雖然有時基於Flask作開發時會借鑑Django上的一些優勢,但Flask的地位卻無可動搖。
另外,我記得Django的開發者曾經說過,Django出現的太早了,Flask纔是Django最初預期的樣子,箇中意思,請本身品味,原文原話,我暫時沒有找到,若是有朋友看到原話,麻煩給個連接。
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着手便可。
若要精通Flask,僅僅經過Quickstart快速入門徹底不夠,那怎樣才能把Flask用好呢?用好Flask沒什麼特殊的捷徑,靠的依然是『多使用、多思考、多看他人優秀的代碼』,經驗多是編程世界裏最恰當稱之爲掌握新技術的捷徑的東西,而經驗的積累卻又是一個漫長的過程,靠的也是『多使用、多思考、多看他人優秀的代碼』。Flask的精通要靠本身努力,優秀的資料能夠分享。我在這裏推薦幾個我以爲不錯的資料,歡迎你們補充。
(1) Flask官方文檔
Flask官方文檔寫的仍是至關不錯的,做爲學習Flask的第一手資料沒有問題,且Flask官方的Snippets,對開發頗有幫助,也能避免開發者花太多時間考慮重複的輪子如何開發
(2) Flask Web開發
這本書至關不錯,經過這本書的學習,基本能作到Flask從入門到精通,也是我建議的第一手Flask學習資料。書中介紹的Flask構建大型項目的架構方式,非常受用,頗有實際意義。
上面圖書做者的博客,是積累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有關,但對初學者,絕對有學習的價值
大部分網站都要用數據庫軟件來存儲數據,數據庫對於任何應用而言都是舉足輕重的,所以本節將Flask與數據庫的配合做爲一個專題展開討論。
Flask與數據庫直連來存取數據雖然沒有問題,但會使應用與數據庫緊耦合,不利於擴展,也會增長維護代碼邏輯的工做量。使用數據庫抽象層,會簡化Flask與數據庫交互的邏輯,也使得Flask與數據庫交互的邏輯轉移到數據庫抽象層搞定,使業務邏輯更清晰,開發也更專一。因爲Flask是Micro Framework,自身沒有數據庫抽象層,而Python生態下有很是多的數據庫抽象層可供使用,對Flask而言option很是多,開發者能夠選擇最好的或本身最熟悉的數據庫抽象層應用於開發。
接下來列舉一些我熟悉或使用過的數據庫抽象層。
適用於關係型數據庫的數據庫抽象層及ORM(Object Relation Mapping),適用於Flask有:
NoSQL數據庫很是多,MongoDB是其中一種文檔型的NoSQL數據庫,因爲MongoDB天生就是爲互聯網開發服務的,而我只用Flask + MongoDB 作過開發,下面僅列出MongoDB的抽象層:
一個強大的框架不只要練好本身的內功,還要具有各類趁手的武器和裝備。Flask 易於擴展,爲本身營造了優秀的生態環境,Flask生態下有各類各樣的第三方庫可供使用,這讓咱們開發本身的應用時,更高效、更專一,也更穩定。
下面列舉一些我經常使用或瞭解的庫,做爲入門,熟悉了這些庫,應該很容易開發一個健壯強大的應用了。
爲Flask提供強大的命令行操做,與Django shell相似。
Flask user session 管理,提供諸如login_user
, logout_user
, login_required
, current_user
等功能,也是其餘不少Flask庫的基礎。
爲Flask應用提供操做簡單且易於擴展的數據庫管理界面,與Django自帶的數據庫管理app相似。
Flask與WTForms的集成,提供強大的Form安全和校驗機制,與Django內置的Form功能相似。
Flask強大的權限管理機制,靈活性強,提供了一個權限管理的基礎框架,是不少Flask權限相關擴展的基礎。
一個強大的Flask RESTful框架,簡單好用。
至關於Django REST Framework的Flask版,是另外一個強大的Flask RESTful框架。
Flask-Mail 爲Flask應用添加了SMTP 郵件發送功能
Flask-User集成了用戶管理相關功能,並容許對功能作定製性修改,其相關功能包括Register, Confirm email, Login, Change username, Change password, Forgot password等。
Flask-User 基於Flask-SQLAlchemy
,NoSQL數據庫沒法使用。
Flask-Security讓開發者可以很快的爲應用添加經常使用的安全機制,其整合了Flask-Login
, Flask-Mail
, Flask-Principal
, Flask-Script
等應用。其安全機制包括:
Flask國際化和本地化擴展,基於Babel
爲Flask應用添加語言包,與flask-babel
相似。
我我的對Flask的研究,也基本上是按本文思路一步步展開的,但願對初學Flask的朋友有所幫助。關於Flask或者Python的學習,再補充一點,開發Flask第三方庫,或者完善已有的Flask庫,也是一種很好的實踐方法。
歡迎你們與我交流Flask的使用。