標籤:

為什麼 Flask 有那麼多的好評?

有說吸收了很多好的思想,誰能分析分析,最好能從通用的角度分析,不要局限在語言,框架上


Flask 的作者 Armin Ronacher 很早就開發了 Werkzeug 套件,用於開發高質量的 WSGI Application。後來推薦給 Bottle 作者的時候,Bottle 的作者非常執著於「單文件」和「無依賴」,拒絕了使用 Werkzeug。再後來 Armin Ronacher 基於 Werkzeug 開發了 Flask,並且壓縮成了單個 py 文件,算是黑 Bottle 的一個小玩笑吧。真正溯源,Bottle 和 Flask 應該都是模仿 Ruby 的 Sinatra 吧……

後來 Flask 獲得比 Bottle 更多的關注,個人推測是因為其開發和設計的實用主義作風。無論是 Unicode 支持(這塊在 Python 2.x 下還挺疼的)還是 Message Flash 這樣的小功能,Flask 都做的非常人性化。除此以外,可插拔的 Extension 機制和 Blueprint 等設計,都為項目從小發展到大的需求做了考慮。另外對於開發、測試 Web 應用中的一些優秀模式,Flask 維護團隊在文檔、郵件列表等處都非常努力地做了傳播。

其實就算拋開 Flask 不說,Werkzeug 本身也是一個高質量的庫。Flask 被開發出來,初衷也是展示如何用 Werkzeug 定製出一個 Web 框架。如果說要給 Flask 的設計多少多少好評,有木有想過這些好評也許是應該屬於 Werkzeug 的呢 &<( ̄︶ ̄)&>


Flask是一個優秀的Web框架,很多人說它好,但是95%的人其實是在人云亦云,不去讀它的源碼、不了解作者其他項目、不深入使用很難真的理解它的好。我試著介紹下它備受好評的一些原因:

1. 文檔和snippets。文檔算是非常好了,基本上你應該知道的都用比較通俗易懂的方式傳達給你了,還會告訴你應該怎麼設計。但是其實我還想說的是 http://flask.pocoo.org/snippets/,對於文檔不滿足的其實作者和一些深度用戶都已經給了方案,比如會話(session),有專門的分類http://flask.pocoo.org/snippets/category/sessions/,相了解怎麼個Redis集成,直接看http://flask.pocoo.org/snippets/75/就好了。

2. 設計哲學。Flask和Django甚至在這點上是完全相反的,Flask只願意提供最小的核心,給你足夠的自由,你去試試提交PR想加入一些依賴或者對一些你工作中需要的,但是有點小眾的功能有多難,很難說服Flask團隊的人支持你。但是Flask提供了非常好的擴展系統,哪怕你是一個新手,也能在文檔的提示下編寫一個可用的擴展。這樣做唯一的缺點就是第三方擴展生態環境非常繁盛,但是質量參差不齊,考驗你的眼力。我覺得大家喜歡Flask的原因之一就是這種設計哲學和Python工程師的氣質是有重合的。

3. 裝飾器表示路由。第一次看官方的例子,我都目瞪口呆了。原來裝飾器可以這樣用,逼格比其他的Web框架在我心中高了一點點。

4. Flask的依賴Werkzeug是一個WSGI工具集,https://github.com/twisted/klein 也使用了。它有什麼好呢?其中包含了實現非常好的LocalProxy、cached_property、import_string、find_modules、TypeConversionDict等。LocalProxy這種本地代理的思想,給開發者提供了非常大的空間;除了上面提到的還有多種數據結構,可以看https://github.com/pallets/werkzeug/blob/master/werkzeug/datastructures.py,現在我們在不同的項目都會依賴Werkzeug(不是Flask的),有時候竟然就是為了用cached_property等實現...;那import_string+find_modules能幹什麼呢? 可以看專欄文章 https://zhuanlan.zhihu.com/p/22774028 ,裡面有對重構大型項目下多個藍圖(blueprint)的應用。

5. 藍圖(Blueprint)實現了應用的模塊化,使用藍圖讓應用層次清晰,開發者可以更容易的開發和維護項目。藍圖通常作用於相同的URL前綴,比如/user/:id、/user/profile這樣的地址,都以/user開頭,那麼就可以放在一個模塊中。使用register_blueprint註冊模塊,如果想去掉模塊只需要去掉對應的這個註冊語句即可,多方便。

6. 上下文(Context)。先看一個示例:

from flask import Flask, request

app = Flask(__name__)

@app.route("/people/")
def people():
name = request.args.get("name")

仔細想一下,這裡先引用了flask.request,但是直到用戶訪問/people/的時候才通過request.args.get("name")獲得請求的參數值。試想,引用的時候還沒有發生這個請求,那麼請求上下文是怎麼獲得的呢?

flask.request就是一個獲取名為_request_ctx_stack的棧頂對象的LocalProxy實例:

from functools import partial
from werkzeug.local import LocalProxy

def _lookup_req_object(name):
top = _request_ctx_stack.top
if top is None: # 所以注意,一定要先把請求推入堆棧再調用
raise RuntimeError("working outside of request context")
return getattr(top, name)

request = LocalProxy(partial(_lookup_req_object, "request"))

上述邏輯能正常使用,是因為其流程是這樣的:

  • 用戶訪問產生請求。
  • 在發生請求的過程中向_request_ctx_stack推入這個請求上下文的對象,它會變成棧頂。request就會成為這個請求上下文,也就包含了這次請求相關的信息和數據。
  • 在視圖函數中使用request就可以使用request.args.get("name")了。

設想不使用LocalStack和LocalProxy的話,要想讓視圖函數訪問到請求對象只能將其作為參數,一步步傳入視圖函數中。這樣做的缺點是會讓每個視圖函數都增加一個request參數,而Flask巧妙地使用上下文把某些對象變為全局可訪問(實際上是特定環境的局部對象的代理),每個線程看到的上下文對象卻是不同的,這樣就巧妙地解決了這個問題。

歡迎關注本人的微信公眾號獲取更多Python相關的內容(也可以直接搜索「Python之美」):

http://weixin.qq.com/r/D0zH35LE_s_Frda89xkd (二維碼自動識別)


根據上面的回答小節,新手學習Flask、之後Django,然後Tornado,學以致用,技多鬼壓床


看過flask的入門文檔.

相對與django而言, flask的入門文檔簡直人性.

我看django的tutorial, 每次都有新收穫, 簡直了.

所以flask上手快, 看完入門指南能立即有思路.

看完django入門文檔, ... 呵呵

所以flask的學習曲線比django的要平滑很多. 這是很吸引人的.

------------

但是我用的是django... =_=


Django太大了,文檔說實話閱讀性挺差的。

Tornado文檔雖然也很不錯,但是全英文把很多人都拒之門外(包括一開始接觸Python框架的我)。

Flask文檔非常人性,先來個入門指南建立一下信心,而且初期用到的指南里都提及了,框架雖然小,但是全啊,而且插件多得可怕,即插式的插件實在太方便了。

學到中途再讀Flask源碼的時候發現它源碼寫得實在良心,我一個第一次讀框架源碼的都能讀得不錯簡直是業界良心。

不過現在準備轉轉Tornado了,發現Tornado雖然造輪子是常態但是框架提供的都是核心功能呀,二者都是良心。至於Django嘛- -我真不喜歡這個框架。


之前用過flask,大概來說,

一是看上去簡單,對於有編程經驗的人來說,上手很快。

二是文檔很好。

三是很多擴展看上去也很合理。

。。。

後來的時候,發現其實也不簡單,需要某些功能要使用插件也是要學習成本的,而且文檔更分散。擴展的文檔有的也不那麼好,要去看源文件,甚至連很常用的,flask-sqlchemy。有的擴展不太給力,比如flask-mail的master分支不能在gae上用。

使用flask感覺還是很愉快的,如果說是為了折騰是一個很好的東西。如果是為了生產,django更值得信賴。


1.開箱即用

2.低耦合

3.可擴展

4.文檔完善


用起來很高效,做中小型網站完全夠了。

輕量級,提供機制,而不是強加規範。

藍圖,很新穎的抽象,基本是 module 的概念,至於 module 內部的結構如何劃分,並無任何限制,給了用戶很高的自由度。

總結:不用寫多餘的框架性代碼,依然能很好的組織項目。


簡單、優雅、擴展性強,加之使用python語言。我喜歡。


它本是一個笑話,https://zh.wikipedia.org/wiki/Flaskhttps://zh.wikipedia.org/wiki/Flask

本來只是作者的一個愚人節玩笑,不過後來大受歡迎,進而成為一個正式的項目。"It came out of an April Fool"s joke but proved popular enough to make into a serious application in its own right."


文檔(最重要):

Flask你可以看官方文檔,你就可以自己寫一個差不多的博客網站出來。這對於一個新手來說,是個上手極快的過程。

框架:

路由、藍圖、session等都有不錯的介面,也有非常多的第三方包。助於項目開發。

Just do it!試著用用。。


說一下我的使用感受,最初剛學python,先看的django,跟著官方文檔做例子,有點無腦,配置多一些。

後來,學習了flask,也是看的官方文檔,學的很舒服,微內核和可擴展對初學者也很有好處。

作為一名入門者,我覺得的,Flask更適合初學者,你可以自己實現一些功能,也可以使用豐富的擴展,這樣可以避免只會使用擴展,而不懂原理的問題,靈活性完全在你自己手裡。

還有,django和flask的文檔都超贊的說~

其他學習資料django要比flask學習多一些


推薦閱讀:

Flask表單疑問,這個name是怎麼傳進來的?
學習Flask需要什麼基礎?
關於學習Flask過程中Python虛擬環境的激活問題?
希望用flask作為中介讓python和js交互,大家有什麼比較好的實踐經驗沒?
《Flask Web開發》中程序的許可權為什麼用十六進位表示?

TAG:Python | Flask |