Flask 入門指南

本文首發(fā)于Gevin的博客

原文鏈接:Flask 入門指南

未經(jīng) Gevin 授權(quán),禁止轉(zhuǎn)載

Flask 入門指南

1. 初識(shí)Flask

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

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

“微”(micro) 并不意味著你要把整個(gè)web應(yīng)用放到一個(gè)python文件里(雖然確實(shí)可以),也不意味著Flask 在功能上有所欠缺。微框架中的“微”意味著 Flask 旨在保持核心功能的簡(jiǎn)單而易于擴(kuò)展。Flask 不會(huì)替你做出太多決策,比如使用何種數(shù)據(jù)庫。而那些 Flask 幫你做好的決策(比如使用哪種模板引擎),都是很容易替換。除此之外的一切都由可由你掌握。

默認(rèn)情況下,F(xiàn)lask 不包含數(shù)據(jù)庫抽象層、表單驗(yàn)證,或是任何已在其它已庫中處理的很好的功能。相反,F(xiàn)lask 支持通過擴(kuò)展來給應(yīng)用添加這些功能,如同是 Flask 本身實(shí)現(xiàn)的一樣。眾多的擴(kuò)展提供了數(shù)據(jù)庫集成、表單驗(yàn)證、上傳處理及各種各樣的開放認(rèn)證技術(shù)等功能。Flask 也許是“微小”的,但它已準(zhǔn)備好在復(fù)雜的生產(chǎn)環(huán)境中投入使用。

Flask盡量避免重復(fù)制造輪子,而是與已有的優(yōu)秀輪子去結(jié)合,這使得Flask靈活、強(qiáng)大,且定制性更強(qiáng)。
Flask 配置選項(xiàng)眾多,均設(shè)置了合理的默認(rèn)值,并會(huì)遵循一些慣例;配置選項(xiàng)均可以修改,但通常沒必要修改,尤其是剛開始的時(shí)候。這使得Flask易于上手。

2. Flask VS Django

Django和Flask是GitHub上star數(shù)量最多的2個(gè)Python web框架,網(wǎng)上也有很多文章對(duì)這兩個(gè)web框架進(jìn)行分析和對(duì)比,如:

Flask和Django各有優(yōu)劣,Gevin最初是基于Django做開發(fā)的,后來轉(zhuǎn)向Flask,目前兩個(gè)框架都在使用,就我個(gè)人而言,我對(duì)這兩個(gè)框架比較如下:

(1)Flask

  • Flask確實(shí)很“輕”,不愧是Micro Framework,從Django轉(zhuǎn)向Flask的開發(fā)者一定會(huì)如此感慨,除非二者均為深入使用過
  • Flask自由、靈活,可擴(kuò)展性強(qiáng),第三方庫的選擇面廣,開發(fā)時(shí)可以結(jié)合自己最喜歡用的輪子,也能結(jié)合最流行最強(qiáng)大的Python庫
  • 入門簡(jiǎn)單,即便沒有多少web開發(fā)經(jīng)驗(yàn),也能很快做出網(wǎng)站
  • 非常適用于小型網(wǎng)站
  • 非常適用于開發(fā)web服務(wù)的API
  • 開發(fā)大型網(wǎng)站無壓力,但代碼架構(gòu)需要自己設(shè)計(jì),開發(fā)成本取決于開發(fā)者的能力和經(jīng)驗(yàn)
  • 各方面性能均等于或優(yōu)于Django
  • Django自帶的或第三方的好評(píng)如潮的功能,F(xiàn)lask上總會(huì)找到與之類似第三方庫
  • Flask靈活開發(fā),Python高手基本都會(huì)喜歡Flask,但對(duì)Django卻可能褒貶不一
  • Flask與關(guān)系型數(shù)據(jù)庫的配合使用不弱于Django,而其與NoSQL數(shù)據(jù)庫的配合遠(yuǎn)遠(yuǎn)優(yōu)于Django
  • Flask比Django更加Pythonic,與Python的philosophy更加吻合

(2)Django

  • Django太重了,除了web框架,自帶ORM和模板引擎,靈活和自由度不夠高
  • Django能開發(fā)小應(yīng)用,但總會(huì)有“殺雞焉用牛刀”的感覺
  • Django的自帶ORM非常優(yōu)秀,綜合評(píng)價(jià)略高于SQLAlchemy
  • Django自帶的模板引擎簡(jiǎn)單好用,但其強(qiáng)大程度和綜合評(píng)價(jià)略低于Jinja
  • Django自帶ORM也使Django與關(guān)系型數(shù)據(jù)庫耦合度過高,如果想使用MongoDB等NoSQL數(shù)據(jù),需要選取合適的第三方庫,且總感覺Django+SQL才是天生一對(duì)的搭配,Django+NoSQL砍掉了Django的半壁江山
  • Django目前支持Jinja等非官方模板引擎
  • Django自帶的數(shù)據(jù)庫管理app好評(píng)如潮
  • Django非常適合企業(yè)級(jí)網(wǎng)站的開發(fā):快速、靠譜、穩(wěn)定
  • Django成熟、穩(wěn)定、完善,但相比于Flask,Django的整體生態(tài)相對(duì)封閉
  • Django是Python web框架的先驅(qū),用戶多,第三方庫最豐富,最好的Python庫,如果不能直接用到Django中,也一定能找到與之對(duì)應(yīng)的移植
  • Django上手也比較容易,開發(fā)文檔詳細(xì)、完善,相關(guān)資料豐富

就我個(gè)人而言,雖然我最初選擇的Python web框架是Django,但當(dāng)我開始研究Flask后,F(xiàn)lask就立刻成為我最喜歡的框架,雖然有時(shí)基于Flask做開發(fā)時(shí)會(huì)借鑒Django上的一些優(yōu)點(diǎn),但Flask的地位卻無可動(dòng)搖。

另外,我記得Django的開發(fā)者曾經(jīng)說過,Django出現(xiàn)的太早了,F(xiàn)lask才是Django最初預(yù)期的樣子,個(gè)中意思,請(qǐng)自己品味,原文原話,我暫時(shí)沒有找到,如果有朋友看到原話,麻煩給個(gè)鏈接。

3. Flask從入門到精通

3.1 Flask入門

Flask上手非常容易,僅僅看完Flask官方文檔中的Quickstart部分,就可以實(shí)現(xiàn)簡(jiǎn)單的網(wǎng)站了。當(dāng)然,網(wǎng)站看起來好不好,與html, CSS和js水平有關(guān),這不在Flask的使用范圍之內(nèi)。

接下來就Quickstart章節(jié)的內(nèi)容做一點(diǎn)解釋。

文中一開始就指明了,以下簡(jiǎn)單幾行代碼,即可拉起一個(gè)網(wǎng)站:

from flask import Flask
app = Flask(__name__)

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

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

簡(jiǎn)言之,只要?jiǎng)?chuàng)建一個(gè)Flask的實(shí)例(如上面的app),調(diào)用run()方法,網(wǎng)站即被拉起。 @app.route('/')設(shè)置網(wǎng)站的url路由,下面的函數(shù)實(shí)現(xiàn)了訪問該url時(shí)要運(yùn)行的功能。僅基于以上簡(jiǎn)單代碼承載的邏輯,即可把任一個(gè)python 庫的功能轉(zhuǎn)換成網(wǎng)站或簡(jiǎn)單的web api,如果想開放RESTful API,基于這個(gè)邏輯從零開始做完成沒有問題,雖然更好的方式是基于RESTful相關(guān)第三方庫。隨著網(wǎng)站的功能的增加,代碼的行數(shù)也會(huì)劇增,這時(shí)所有的代碼都放到一個(gè)文件中會(huì)很難管理,因此,F(xiàn)lask雖然一個(gè)文件就可以實(shí)現(xiàn)一個(gè)網(wǎng)站,但即便做一個(gè)小型網(wǎng)站,最好的方式也是將不同的邏輯放到不同的文件中,文件的組織方式隨個(gè)人喜好而定,可以借鑒他人優(yōu)秀的代碼,也可以自己摸索。

做一個(gè)網(wǎng)站,最基本的功能莫過于信息/錯(cuò)誤的返回,頁面的渲染,靜態(tài)文件的加載,URL構(gòu)建,session/cookie的使用,request/response的處理等,這些在Quickstart中都有涉及,掌握這些內(nèi)容,做簡(jiǎn)單網(wǎng)站就足夠了,即入門從Quickstart著手即可。

3.2 Flask精通

若要精通Flask,僅僅通過Quickstart快速入門完全不夠,那怎樣才能把Flask用好呢?用好Flask沒什么特殊的捷徑,靠的依然是『多使用、多思考、多看他人優(yōu)秀的代碼』,經(jīng)驗(yàn)可能是編程世界里最恰當(dāng)稱之為掌握新技術(shù)的捷徑的東西,而經(jīng)驗(yàn)的積累卻又是一個(gè)漫長的過程,靠的也是『多使用、多思考、多看他人優(yōu)秀的代碼』。Flask的精通要靠自己努力,優(yōu)秀的資料可以分享。我在這里推薦幾個(gè)我覺得不錯(cuò)的資料,歡迎大家補(bǔ)充。

(1) Flask官方文檔

Flask官方文檔寫的還是相當(dāng)不錯(cuò)的,作為學(xué)習(xí)Flask的第一手資料沒有問題,且Flask官方的Snippets,對(duì)開發(fā)很有幫助,也能避免開發(fā)者花太多時(shí)間考慮重復(fù)的輪子如何開發(fā)

(2) Flask Web開發(fā)

這本書相當(dāng)不錯(cuò),通過這本書的學(xué)習(xí),基本能做到Flask從入門到精通,也是我建議的第一手Flask學(xué)習(xí)資料。書中介紹的Flask構(gòu)建大型項(xiàng)目的架構(gòu)方式,很是受用,很有實(shí)際意義。

(3) miguelgrinberg.com

上面圖書作者的博客,是積累Flask開發(fā)經(jīng)驗(yàn)的好資料

(4) Write a Tumblelog Application with Flask and MongoEngine

這是MongoDB官方文檔中的一個(gè)教程,也是學(xué)習(xí)Flask開發(fā)的一個(gè)很好案例,尤其適合Flask+MongoDB開發(fā)的應(yīng)用場(chǎng)景

(5) Flask 源碼

Flask 本身是一個(gè)非常優(yōu)秀的Python庫,閱讀其源碼對(duì)理解Flask及提高Python開發(fā)水平非常有幫助。

(6) The Hitchhiker’s Guide to Python!

這個(gè)資料雖然不直接與Flask有關(guān),但對(duì)初學(xué)者,絕對(duì)有學(xué)習(xí)的價(jià)值

4. Flask與數(shù)據(jù)庫

大部分網(wǎng)站都要用數(shù)據(jù)庫軟件來存儲(chǔ)數(shù)據(jù),數(shù)據(jù)庫對(duì)于任何應(yīng)用而言都是舉足輕重的,因此本節(jié)將Flask與數(shù)據(jù)庫的配合作為一個(gè)專題展開討論。

Flask與數(shù)據(jù)庫直連來存取數(shù)據(jù)雖然沒有問題,但會(huì)使應(yīng)用與數(shù)據(jù)庫緊耦合,不利于擴(kuò)展,也會(huì)增加維護(hù)代碼邏輯的工作量。使用數(shù)據(jù)庫抽象層,會(huì)簡(jiǎn)化Flask與數(shù)據(jù)庫交互的邏輯,也使得Flask與數(shù)據(jù)庫交互的邏輯轉(zhuǎn)移到數(shù)據(jù)庫抽象層搞定,使業(yè)務(wù)邏輯更清晰,開發(fā)也更專注。由于Flask是Micro Framework,自身沒有數(shù)據(jù)庫抽象層,而Python生態(tài)下有非常多的數(shù)據(jù)庫抽象層可供使用,對(duì)Flask而言option非常多,開發(fā)者可以選擇最好的或自己最熟悉的數(shù)據(jù)庫抽象層應(yīng)用于開發(fā)。

接下來列舉一些我熟悉或使用過的數(shù)據(jù)庫抽象層。

4.1 適用于關(guān)系型數(shù)據(jù)庫的數(shù)據(jù)庫抽象層

適用于關(guān)系型數(shù)據(jù)庫的數(shù)據(jù)庫抽象層及ORM(Object Relation Mapping),適用于Flask有:

4.2 適用于NoSQL數(shù)據(jù)庫的數(shù)據(jù)庫抽象層

NoSQL數(shù)據(jù)庫非常多,MongoDB是其中一種文檔型的NoSQL數(shù)據(jù)庫,由于MongoDB天生就是為互聯(lián)網(wǎng)開發(fā)服務(wù)的,而我只用Flask + MongoDB 做過開發(fā),下面僅列出MongoDB的抽象層:

5. Flask 常用庫

一個(gè)強(qiáng)大的框架不僅要練好自己的內(nèi)功,還要具備各種趁手的武器和裝備。Flask 易于擴(kuò)展,為自己營造了優(yōu)秀的生態(tài)環(huán)境,F(xiàn)lask生態(tài)下有各種各樣的第三方庫可供使用,這讓我們開發(fā)自己的應(yīng)用時(shí),更高效、更專注,也更穩(wěn)定。

下面列舉一些我常用或了解的庫,作為入門,熟悉了這些庫,應(yīng)該很容易開發(fā)一個(gè)健壯強(qiáng)大的應(yīng)用了。

5.1 Flask 常用庫列表

5.2 Flask 常用庫詳情

flask-script

為Flask提供強(qiáng)大的命令行操作,與Django shell類似。

flask-login

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

flask-admin

為Flask應(yīng)用提供操作簡(jiǎn)單且易于擴(kuò)展的數(shù)據(jù)庫管理界面,與Django自帶的數(shù)據(jù)庫管理app類似。

Flask-WTF

Flask與WTForms的集成,提供強(qiáng)大的Form安全和校驗(yàn)機(jī)制,與Django內(nèi)置的Form功能類似。

flask-principal

Flask強(qiáng)大的權(quán)限管理機(jī)制,靈活性強(qiáng),提供了一個(gè)權(quán)限管理的基礎(chǔ)框架,是很多Flask權(quán)限相關(guān)擴(kuò)展的基礎(chǔ)。

flask-restful

一個(gè)強(qiáng)大的Flask RESTful框架,簡(jiǎn)單好用。

flask-api

相當(dāng)于Django REST Framework的Flask版,是另一個(gè)強(qiáng)大的Flask RESTful框架。

Flask-Mail

Flask-Mail 為Flask應(yīng)用添加了SMTP 郵件發(fā)送功能

Flask-User

Flask-User集成了用戶管理相關(guān)功能,并允許對(duì)功能做定制性修改,其相關(guān)功能包括Register, Confirm email, Login, Change username, Change password, Forgot password等。

Flask-User 基于Flask-SQLAlchemy,NoSQL數(shù)據(jù)庫無法使用。

flask-security

Flask-Security讓開發(fā)者能夠很快的為應(yīng)用添加常用的安全機(jī)制,其整合了Flask-Login, Flask-Mail, Flask-Principal, Flask-Script等應(yīng)用。其安全機(jī)制包括:

  • 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國際化和本地化擴(kuò)展,基于Babel

flask-locale

為Flask應(yīng)用添加語言包,與flask-babel類似。

6. 最后

我個(gè)人對(duì)Flask的研究,也基本上是按本文思路一步步展開的,希望對(duì)初學(xué)Flask的朋友有所幫助。關(guān)于Flask或者Python的學(xué)習(xí),再補(bǔ)充一點(diǎn),開發(fā)Flask第三方庫,或者完善已有的Flask庫,也是一種很好的實(shí)踐方法。

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,316評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,481評(píng)論 3 415
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,241評(píng)論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,939評(píng)論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,697評(píng)論 6 409
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,182評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,247評(píng)論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,406評(píng)論 0 288
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,933評(píng)論 1 334
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,772評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,973評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,516評(píng)論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,209評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,638評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,866評(píng)論 1 285
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,644評(píng)論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,953評(píng)論 2 373

推薦閱讀更多精彩內(nèi)容