程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Flask 與 Django 框架對比

編輯:Python

詳細分析了兩種 Python Web框架: Flask 與 Django。從開發難易度、應用架構、性能、可擴展性以及適用范圍等方面進行了詳細說明。

Django 中級教程在 B 站上線,深入解析 Django 體系架構,實現從入門到精通的跨越。在線教程

前言

基於 Github 排名第二的程序設計語言 - Python,有許多可用的 Web 框架,Django 與 Flask 是兩個獨立的 Python 框架,為開發者解決許多復雜低層代碼問題。通常來講 Django 常應用於全棧應用開發,而 Flask 常於服務架構。


一、Flask 概述

Flask 由澳大利亞工程師 Armin Ronacher 創建,是一個輕量級的微服務框架,讓開發者可以自由選擇設計模式、數據庫及工具。它的學習成本小,適用於構建可擴展的 Web應用。
Flask 使用下面兩個協議來實現 Web 通訊以及網站的展示層:

  • WSGI: 用於與 web 服務器的通訊。
  • jinja2: 用於 Web 服務的展現層網站界面設計。

1. 適用場景

  • 小規模、低復雜度的項目
  • 集成機構學習或深度學習應用
  • 無服務器的計算
  • 無數據庫或 NoSQL數據庫服務
  • 靜態或 RESTful web 服務

2.Flask 案例

  • Netflix 使用 Flask APIs 實現局部故障轉移以及流星分配。
  • Airbnb 在其 Airflow 項目中使用Flask,並基於 Flask-admin 庫增加了管理界面。
  • Uber 使用 Flask 來優化控制、實現動態價格和司機位置定位。
  • Lyft 使用信號模塊為 web 用戶交互提供數據。
  • Pinterest 是使用 Flask 構建大規模網站的開發之一,它在可擴展財富生態系統中使用 Flask 。
  • Twilio 使用 Flask 在短時間內開發出公有和私有基於 REST 搞用的API。

二、Django 概述

Django 是由工作於Lawrence Journal-World 報社的 Adrian Holovaty 和 Simon Willison 創建,命名來自於著名吉他手 Django Reinhardt。2003年開始,2008年發布第一個版本。
Django 為開發者提供全棧開發架構,使開發者可以快速安全的構造 Web 應用。本身提供眾多的功能用於構造完整應用,支持眾多格式(HTML、RSS、JSON、XML等等)。另外 Django 提供安全框架和易於大規模部署的架構。

1. 適用場景

  • 需要 ORM 支持的 Web 應用
  • API 後端開發
  • 大規模可擴展的應用
  • 集成 ML
  • 數據驅動的應用

2. 典型應用

  • Disqus: 博客應用,每月處理來191個國家超20億用戶的 5 千萬評論和170億的點擊量。全站都是基於 Django 開發,在創建以後非常易於擴容。
  • Spotify: 實現音樂分享,有來自全球的用戶同時使用其後台及機器學習系統。
  • Mozilla: 切換到 Python 及 Django 架構來滿足不斷增長的流量及 API 訪問。
  • Dropbox: 實現一系列功能,如用戶歷史、跨設備訪問同步、各種文件分享功能等。
  • Instagram: 使用 Django 在不修改和中斷用戶界面操作的情況下來滿足不斷增加的訪問流量。

三、優缺點

1. Flask優點

  • 簡單易學: 開發者可以快速掌握 Web 開發,學習、開發、維護應用都相對容易。
  • 易於構建原型: 架構抽象層次較少,讓開發者可以快速構建原型。
  • 代碼庫小: 基礎庫代碼少,有效降低應用的大小。
  • 靈活: 開發者可以按需將外部元素加入到項目之中。架構沒有嚴格的設計模式、協議及數據庫要求。每個部件可靈活替換。

2. Flask 缺點

  • 構建復雜系統過程較繁瑣: 在特別復雜系統裡開發者需要引入過多的第三方庫,造成代碼庫維護麻煩。
  • 處理多請求時開銷比較大: 由於沒有內置的異步機制,處理大量請求時會花費過多的時間。
  • 安全風險: 由於內置功能較少而引用大量的第三方工具庫,對系統的安全帶來較大風險。
  • 維護成本高: 在長期運行及開發過程中,維護過多的第三方庫(例如庫的廢棄、不兼容)會帶來昂貴的成本。

3. Django 優點

  • 快速開發: 開發者利用自帶豐富的標准庫大大減少開發時間,利用產品快速上線。
  • 擴展好: 提供許多管理工具滿足系統規模和用戶增長的需求,可輕松擴展滿足百萬級用戶訪問請求。
  • 安全性高: 提供眾多內置安全工具,保證應用不受常見的跨站攻擊、SQL注入等漏洞影響。
  • 靈活性好: 開發中大量工具庫及軟件庫隱藏了開發實現的細節,應用可以根據市場需求快速實現應用功能轉換。
  • 對機器學習友好: 計算和統計能力使得架構更易於實現機器學習算法。開發者較容易向應用中加入高級功能並實現定制開發。
  • 眾多開發者: 使用最流行的 Python 語言開發, 有大量的開發者支持,社區資源也豐富豐富。

4. Django 缺點

  • 不太適合較小規模的項目: Django 是代碼密集型框架,會占用較多機器性能及網絡帶寬。如果項目規模在未來不會擴展太大,學習和使用的成本會較高。
  • 每次處理一個請求: 不像其它常用的框架,Django 本身是單任務,不能同時並發處理多個請求,而且開發者難通過底層代碼修改來提供並發處理功能。(Django生產環境通過 Web 服務器多線程及消息隊列等能實現應用級別的多請求及異步處理)
  • 發展較慢:Django框架較龐大,各個模塊耦合度高,為了向前兼容,制約框架總體開發及迭代速度。

四、性能及速度對比

Flask 在處理 JSON格式的請求及返回時速度很快。它能快速構建 MVP 模式的應用, 同其它 Python 框架相比,輕量化、高性能、開發棧簡單是它的一大特點。對於追求高效開發過程有時並不適合。下圖是性能測試的對比圖:

Django 不是性能最高的框架。所以接下來的問題,應用到底需要多少的運行速度 在不正確使用 Django 的情況,會造成一些處理上的瓶頸,例如:高並發的 JSON 序列化請求、頻繁的數據庫與 Python 對象轉換、通過中間處理請求。
但事實上,這些問題可以通過良好的開發規范、合理硬件部署以及鑒別優化核心功能點來解決。下圖是 Django 與其它語言在不同規格機器上的性能測試結果:

五、其它比較

1. 應用架構

  • Flask 對應用的設計及體系結構沒有硬性要求。它只提供了一個結構應用實現的藍圖。代碼按可復用組件方式組織,由它是微服務架構,不涉及展現層的實現細節。
  • Django 遵循 MVT (Model View Template,模型視圖模板) 系統架構,是常見 MVC 的一個變種。兩種架構最大的區別是模板文件包含 HTML 及 Django 模板語言來動態升成 Web 網站。在用戶有個性化界面需求時,實現起來會非常方便,例如 Instagram。

2. 可擴展性

  • Flask 基於數據存儲支持提供良好的可擴展性,服務器數量增加時可加倍提升數據處理性能。但對支持全局代理以及本地代理(如線程、進程和greenlet)服務器,Flask 並沒提供相應工具支持,它限制了Flask的可擴展性。
  • Django 高並發的典型案例是 OpenStack、Washington Post、Instagram、Spotify 等等。這些大型互聯網應用體現出它的可擴展能力。它可以和許多運維優化技術結合使用來改善情能及加載時間,對於數據庫、圖像以 CSS等都是提供了優化工具。基於 Django 可以允分發揮 CDN 和雲服務的解決方案能力, Django 管理工具可完成這些操作功能而不影響應用代碼,在遠期對可擴展性有要求情況下,Django 是一個不錯的框架。

3. 易於測試能力比較

  • 為了能支持不同架構的 Python 應用模式, Flask 提供了易於實現應用測試的能力,可以使用 Werkzeug 測試客戶端處理單元測試。它還可以與 pytest 或 unittest 結合使用,另外還有一些 Flask-Testing 擴展模塊支持外部單元測試工具。
  • Django 在測試方面也不成問題,它提供一系列簡化測試代碼編寫過程,它提供豐富的文檔來說明測試站點的方法。開發者可輕松實現邏輯層測試並及提供無錯誤的最終產品。

4. 微服務兼容性

Flask 在構建微服務時有如下兩種模式:

  • i.) 不使用額外設計模式或依賴包。開發者使用自身插件就能來部署高性能微服務。
  • ii.) 它還提供 flask_nameko 包裝器與 Nameko 配合實現微服務架構。
    兩種模式都是構建微服務的有效方法。
    Django 自然也提供微服務的快速開發功能,它內置了安全、可擴展的微服務後端模塊。典型的 Django 項目可以由微模塊組成,在系統架構設計上合理規劃微服務模塊可以充分利用Django的微服務框架。在很多情況下,Django 微服務是為了將 ML(機器學習)功能引入到開發項目中。

5. 數據庫支持

  • Flask 與數據庫無直接關聯,開發者可以自由選擇數據庫及適配器。Flask 使用 DbAdapters 來支持不同數據庫,它使用 SQLALchemy 來支持眾多基於 SQL 數據庫,使用 MongoDbAdapter 來訪問 MongoDB 數據庫。在 DbAdapters 基礎上開發者可以擴展以支持更多類型數據庫。
  • Django 官方提供對 PostgreSQL, MariaDB, MySQL, Oracle, 及 SQLite 的數據庫支持,通過第三方包可以實現與其它數據庫的對接。 另外 Django 還提供多數據源連接支持,其模型與數據庫對象轉換、遷移工具極大方便了數據模型設計與同步。可以負責的講,對於 Web站點及應用,Django 都是很好的數據庫工具。

六、結論

Django 及 Flask 都是構建高質量應用的常用框架,使用中需要綜合分析然後加以選擇。

1. Flask 適用的場景

  • 對於較短開發周期時,Flask 更易於學習上手開發。
  • 項目並不需要全棧(前端、後端、數據庫)完成支持。
  • 開發原型或進行初步驗證。
  • 小規模不復雜的項目。
  • 構建無服務應用
  • 構建靜態或 RESTful Web 服務.

2. Django 適用場景

  • 構造可定制、動態變化的社交媒體網站。
  • 具有高度個性化並集成機器學習( ML)功能的應用。
  • 構建類似電子商務平台的 CRM 或訂單處理引擎。
  • 構建安全的 B2B 應用。
  • 構建數據驅動的旅游、食品或醫院健康應用。
  • 構建數據分析及可視化應用。

先自我介紹一下,小編13年上師交大畢業,曾經在小公司待過,去過華為OPPO等大廠,18年進入阿裡,直到現在。深知大多數初中級java工程師,想要升技能,往往是需要自己摸索成長或是報班學習,但對於培訓機構動則近萬元的學費,著實壓力不小。自己不成體系的自學效率很低又漫長,而且容易碰到天花板技術停止不前。因此我收集了一份《java開發全套學習資料》送給大家,初衷也很簡單,就是希望幫助到想自學又不知道該從何學起的朋友,同時減輕大家的負擔。添加下方名片,即可獲取全套學習資料哦


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved