Django和Flask這兩個框架在設計上各方面有什麼優缺點?

如果可以的話,請從整體設計,路由設計,應用模塊化設計,配置等方面比較一下這兩個框架。

十分感謝。


謝邀,話題有些大,網上的比較也比較多,知乎現在娛樂化嚴重,這裡就簡單說一下,歡迎大家一起探討。

一、整體設計方面

首先,兩者都是非常優秀的框架。整體來講,兩者設計的哲學是區別最大的地方。

Django提供一站式的解決方案,從模板、ORM、Session、Authentication等等都分配好了,連app劃分都做好了,總之,為你做盡量多的事情,而且還有一個killer級的特性,就是它的admin,配合django-suit,後台就出來了,其實最初Django就是由在新聞發布公司工作的人設計的。

Flask只提供了一些核心功能,非常簡潔優雅。它是一個微框架,其他的由擴展提供,但它的blueprint使它也能夠很方便的進行水平擴展。

二、路由設計

Django的路由設計是採用集中處理的方法,利用正則匹配。Flask也能這麼做,但更多的是使用裝飾器的形式,這個有優點也有缺點,優點是讀源碼時看到函數就知道怎麼用的,缺點是一旦源碼比較長,你要查路由就不太方便了,但這也促使你去思考如何更合理的安排代碼。

三、應用模塊化設計

Django的模塊化是集成在命令里的,也就是說一開始Django的目標就是為以後玩大了做準備的。每個都是一個獨立的模塊,為以後的復用提供了便利。

Flask通過Blueprint來提供模塊化,自己對項目結構劃分成不同的模塊進行組織。

四、配置

Django的配置主要還是靠settings.py來做,當然為了Development和Production環境分離,還有一些方法來處理配置。

Flask的配置很靈活,有多種方法配置,不同環境的配置也非常方便。

五、文檔

兩者都提供了詳盡的文檔,Flask的文檔風格很受我個人喜好,Django的文檔也非常優秀,當時用學Django時,就是只看了Django的文檔。

六、社區

Django社區很大,各種插件很齊全,大部分情況下你都能找到你想要的。

Flask起步晚,但社區也不小,之前有一次看在github上的star數,兩個相差並不遠,說明越來越多的人關注它,雖然插件沒那麼全,但常用的還都是有的,而且質量都比較高。

最後再次說一下,兩個都是非常優秀的框架,很多時候選用這些框架是根據實際項目側重不同來選的:-)


不要對比Django和Flask的設計上優缺點,現在你們看到的就是作者或者維護團隊對這個框架的理解,也是框架的哲學和精髓。Django是05年開源的,Flask是10年開源的,可以看他們的代碼貢獻者列表,其實不乏領域內的知名的、優秀工程師。這些年過去了,如果設計有問題早就這麼一點點的「掰」過來了,事實上留下來的都是精髓。只能說你更接受那個框架的設計哲學罷了。


這兩個框架我都在用,補充點我對這兩個框架的感受吧

(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上手也比較容易,開發文檔詳細、完善,相關資料豐富

上面這段內容摘自我的博客文章:Flask 入門指南( Gevin"s Blog ),時不時就會在討論Django和Flask的話題中被我摘出來單獨討論 :P


我用了一個月左右的時間(主要是晚上和周末,白天要上班)搭建起我的博客:瓜園耕讀 - 田園將蕪胡不歸,用的是Flask,3000行左右代碼吧。

本來我用PHP寫了近70%~80%的功能了,可我想嘗試一下Python,Just for fun。也想過Django,但我比較喜歡靈活搭配式的風格,所以最終選擇了Flask。

也沒感覺啥難不難、好不好的。總之期間也會出現問題,主要還是樣式布局方面的,跟Python和Flask其實沒多大關係。總之,對於「難不難、好不好」,我的理解是:只有用過,淌過無數坑,發現很多自己解決不了的問題,你才能謂之「難」或「不好」(而且這個「難」或「不好」只是針對自己而言),否則都是人云亦云、道聽途說。


django是早期框架,各種組件齊全,但是都是自己的一套,很難單獨拿出來用,優勢是admin。

flask是後期的設計,比較符合pythonic的設計理念。但是需要使用外部的模板庫和orm等組件。我們在實踐中更喜歡後一種方式。因為django的組件功能較弱。在企業開發中不太好用。

現在的框架,基本都是一個樣的,路由設計都是裝飾風格的,比如flask,pyramid,bottle。而tornado這類屬於伺服器類框架,不好和純app框架比較。

django比較適合中等規模項目。

對於應用開發來說,應該根據不同需求選擇不同框架。現在我們基本都是以pyramid為中心混著用。優點是配置靈活,開發簡單,穩定可靠,經過了多年的檢驗


用過flask,碰到各種坑,這種小眾開源項目,碰到bug,實在是受不了,作者也沒有精力解決,比如, python socket 10054錯誤。原因是當頁面請求比較大的數據 or 需要一定量計算時間的數據, 這個時候, 未等到服務端返回數據, 用戶關閉頁面(close socket client),會導致10054異常,這個異常會直接導致python進程異常退出。這個issue一直開著,還沒有close。

flask宣稱簡單。確實,但是,當你需要orm的時候,還得學習sqlachemy。以前都說Django的orm難用,我擼了一個項目,覺得用起來很簡單,和java的hibernate差不多,如果說有什麼不中意的,就是沒有二級緩存。

還有,flask你遇到bug,想定位的話,不得不定位到它的依賴庫——Werkzeug 。你就慢慢看吧。

還有之前抱怨Django的模版難用。現在也支持了jinja2。

Django1.9+,都挺好的。自從我用過flask之後,我終於明白了為什麼大公司喜歡花幾十萬買redhat的維保。為什麼有得公司不差錢,喜歡用商業產品。產品好不好另說,小眾的開源軟體,絕對不能商用,大坑。

這就是為什麼open source erp 無人問津。除了窮B再用。問題是,窮B公司覺得自己用了erp高大上了,豈不知,這種窮B公司,用excel就可以滿足管理要求了。


django認為他的開發者是 企業資料庫應用開發者,核心痛點在於:用戶需求複雜多變,但是資料庫crud類型應用居多,代碼大量簡單重複,而企業擁有的開發者能力平平。需要一個平台框架,規範開發,簡化開發,提高效率,屏蔽更多技術細節。

django是企業老闆喜歡的,靠他快速做項目賺錢的工具。django封裝屏蔽了技術細節,開發者掌握最少知識就可以開發,技術的事情留給django或者插件來做。django很企業級很重,做到平台化,希望做到傻瓜化開發。

如果django自身如果有問題,開發者會很無力無法掌控。還好django可以滿足大多數應用的需求,開發者不需要折騰。

flask沒有限定開發者的使用模式,只做了一個核心,提供良好的擴展機制。因此flask也非常強調對開發者的體驗,做到了pythonic的漂亮。開發者很爽也可以完全控制到底層。

如果說django是一個黑盒子平台,那flask就是一個可以看到底的小工具。django希望自己是傻瓜化的開發者,跟我走就行;那flask會讓開發者覺得自己聰明可控。

再就是flask的文檔比django也要好。程序員喜歡flask,老闆喜歡django。是這麼回事

其實任何一個項目做大發了,就會逐漸積累一個自己的開發平台。然後企業會獨立一幫人專門做平台,另外一幫人專門做應用。那django說,平台的事,讓我來好了,你們都安心做應用去!特別是資料庫應用


Django就是精裝修的房子帶傢具家電領包入住,flask就是毛坯房,自己想把房子裝成什麼樣自己找材料買傢具自己裝


這麼說呢。。自我感覺吧

django的設計應該是快速開發功能性web App的,模塊化非常地好,並且提倡應用化,就是一個應用只負責一類功能,而整個產品由數個應用構成。我本人是很喜歡這種結構,把複雜的系統拆開來,非常的清晰,易於維護。django的設計思想類似於現在的微服務(當然兩者不是同一個東西),可以讓每個人寫出的項目都有一個清晰統一的結構,非常適合實力參差不齊的團隊開發。。。

但django缺點也很明顯。。如果框架本身限制了你的項目,比如restful(當然有restful framework,不過這東西可以算是一套新框架了。。。),還有一些其它的限制(成熟的重型框架都存在這個問題),那就非常地被動。。而且django的性能(主要體現在並發)不好,如果要要求較高並發性就不要選django了(或者不應該選Python)

flask沒用過,但用過aiohttp,tornado,還有新出的sanic之類的非同步框架。。sanic就是仿flask設計的,這類框架就只提供了最基本的功能handler、middlleware(tornado沒有)之類的,其它的事情都要自己搞(當然flask有很多插件)。對自己的能力比較有自信的話性能一般會比django高,也更易於擴展(當然我最開始用的時候感覺自己寫的像一坨翔,全糊在一起)。

反正看實際需求吧,想開發的又快又穩用django,想有定製性一點,對性能有一定的需求試試這些輕量一點的框架。

不過話說回來要求性能的長期項目何必用Python折磨自己呢?。。。試試Java和Go吧。


微框架和大型框架的區別,和atom跟pycharm的區別差不多。

你用IDE,各種基本功能都給你內置好了。不需要自己一個個裝。 而你用個編輯器,還要自己挑插件裝插件,看起來更geek,也更「靈活」。


用久了django都不會寫python啦??


目前正在學django,還不知道其優缺點,就是感覺它很強大。。。


我用flask,只因為項目太簡單了


flask相比更加靈活,它可以讓你更自由的組織模塊,你可以寫個單文件的app,這可以分層寫app,也可以用藍本實現模塊話,這取決於你的習慣和需求。使用不同的方式調用資料庫等等,每個功能都可以選擇,你可以用其他人寫的中間件,也可以自己寫中間件,或者不用中間件自己實現。而django就不行,你用它就得一路到底,它給你啥也包好了。說的術語點就是django是強耦合的,flask是弱耦合的


推薦閱讀:

Vim 中如何對 Python 進行代碼補全?
GitHub 上有哪些值得關注的 Django 項目?
Django 學習順序及入門要求?
django怎麼讀?
學習 Python web 框架前需要掌握什麼?

TAG:Web開發 | Python | Django框架 | Flask |