1. 程式人生 > Django入門教學 >01 Django 框架簡介

01 Django 框架簡介

圖片描述

你好,歡迎來到這門《Django 框架》教程,這個教程會帶你學習 Python 著名的 Web 開發框架 Django。這節課我們會詳細介紹 Django 框架的發展歷程以及 Django 框架的優缺點,並對其他 Web 開發框架做一個簡單的對比。有的同學可能只學習了基礎語法,對框架的概念不太瞭解,不用擔心,你可以先看一下這篇文章,對 Django 框架有一個大致的瞭解,後面的小節我們對“什麼是框架?”做了詳細的闡述。

1. MVC 與 MTV 介紹

在 Web 框架中,架構模式是其一個重要的特點,往往一個 Web 框架會在設計之初選定好一種架構模式,然後開始該模式設計和編寫相關程式碼,而 Django 則是基於 MTV 架構的模式 。

另一種流行的架構模式為 MVC,它在 Java Web 框架中非常流行。MVC 全稱 Model View Controller,即模型-檢視-控制器。MTV 的全稱是 Model Templates View,即模型-模板-檢視。MTV 中的名詞解釋如下:

  • 模型:在程式中用於處理資料邏輯的部分,大部分情況下是對資料庫的增刪改查的操作;
  • 檢視:該層包含存取模型及調取恰當模板的相關邏輯。用於封裝負責處理使用者請求及返回響應的邏輯;
  • 模板:用於處理使用者顯示部分的內容,和 MVC 中的 V 是一樣的,通過 HTML 展示。它使用模板方法可以動態地生成 HTML。模板包含所需HTML 輸出的靜態部分,以及一些特殊的語法,描述如何將動態內容插入。

MTV 和 MVC 模式並沒有本質上的區別,都是為了實現應用的解耦,只是定義上有些不同。在 MTV 模式的 Web 框架中,沒有 Controll 層,這個是由框架內部實現,我們需要做的就是將 URL 對應到檢視即可,通過這樣的 URL 配置,系統將一個請求傳送到一個合適的檢視進行處理。在 Django 框架中就實現了這樣一個 URL 分發器, 它幫助分發 URL 請求到對應的檢視。

2. Django 框架介紹

首先來看看 Django 誕生的過程:

Django 是從真實世界的應用中成長起來的,它是由堪薩斯(Kansas)州 Lawrence 城中的一個 網路開發小組編寫的。 它誕生於 2003 年秋天,那時 Lawrence Journal-World 報紙的程式設計師 Adrian Holovaty 和 Simon Willison 開始用 Python 來編寫程式。當時他們的 World Online 小組製作並維護當地的幾個新聞站點, 並在以新聞界特有的快節奏開發環境中逐漸發展。這些站點包括有

LJWorld.comLawrence.comKUsports.com, 記者(或管理層) 要求增加的特徵或整個程式都能在計劃時間內快速地被建立,這些時間通常只有幾天或幾個小時。 因此,Adrian 和 Simon 開發了一種節省時間的網路程式開發框架, 這是在截止時間前能完成程式的唯一途徑。2005 年的夏天,當這個框架開發完成時,它已經用來製作了很多個 World Online 的站點。 當時 World Online 小組中的 Jacob Kaplan-Moss 決定把這個框架釋出為一個開源軟體,於是 Django 正式出現在大眾眼前,並且得到了快速發展,原來的World Online的兩個開發者(Adrian and Jacob)仍然掌握著Django,但是其發展方向受社群團隊的影響更大。

Django 基於 MTV 模式,其框架示意圖如下:

圖片描述

Django 框架圖示

Django 框架的核心元件有

  • 用於建立模型的物件關係對映(ORM);

  • 基於正則表示式的 URL 分發器;

  • 檢視系統,用於處理 URL 請求;

  • 模板系統,用於將模板檔案轉換成 HTML 檔案,並在瀏覽器上顯示;

  • 快取系統,並提供多種快取方式。

除此之外 Django 框架中還包括如下功能

  • 輕量級的、獨立的 Web 伺服器,用於開發和測試;

  • 表單序列化及驗證系統 (Form),用於 HTML 表單和資料庫儲存的資料之間的轉換;

  • 中間過濾元件,允許對請求處理的各個階段進行干涉;

  • 序列化系統,能夠生成或讀取採用 XML 或 JSON 表示的 Django 模型例項。

此外,Django 還內建了許多有用的應用,比如一個可擴充套件的認證系統、動態站點管理頁面等等。Django 前身就是線上新聞站點,因此它是非常適合做 Web 站點開發的。

3. Django 的主要版本

到目前為止,Django 已經經歷了三個大的版本,迭代速度之快,令人不得不佩服。不過目前最新的 3.0 版本於19年12月釋出,還處於快速迭代中,不推薦一開始生產環境就使用 3.0。下面我們簡單介紹下 Django 的 1.0 和 2.0 版本之間的主要差別:

支援的 Python 版本:這大概是 Django 1.0 和 2.0 之間一個最明顯的差別了。參考訪問文件,如下:

Django version Python version
1.11 2.7, 3.4, 3.5, 3.6, 3.7 (added in 1.11.17)
2.0 3.4, 3.5, 3.6, 3.7
2.1 3.5, 3.6, 3.7
2.2 3.5, 3.6, 3.7, 3.8 (added in 2.2.8)

可以看到,Django 2.0 之後不再支援 Python 2,甚至 Python 3 的低版本。目前來看,Python 3 已經成了主流,也希望初學者一開始就使用 Python 3進行程式設計,不用再糾結使用 Python 2還是 Python 3。

  • Django 2 相比 Django 1 簡化了 URL 路由語法 以及移動友好的 contrib.admin

  • 當然,更多的是模組功能程式碼上的優化和調整,更多變動細節可以參考這個地址

最後,我們來看看新發布的 Django 3.0 相比 Django 2.0 又有哪些新特點呢

  • 支援 MariaDB Django 現在官方支援 MariaDB 10.1 及以上版本;

  • 支援 ASGI Django 3.0 已經完全支援 async 應用了,並提供了部署非同步應用的說明

  • 在 PostgreSQL 上支援 ExclusionConstraint;

  • Filter 表示式;

  • model field 的 choices 屬性現在支援自定義列舉型別;

  • 一些小變更,就不一一列舉了,大家可以參考官方的 release 資訊。

總而言之,Django 1.0 已經逐漸退出歷史舞臺,2.0 版本是主流,3.0 則是未來。

4. Django 框架優缺點

Django 框架作為一個流行的 Web 框架,其優勢如下

  • 功能完善,文件手冊豐富,可以說是應有盡有。而且自帶大量常用工具和底層封裝;

  • 強大的資料庫訪問元件:開發者可以無差別使用各種資料庫,如 SQLite、MySQL 和 oracle等幾乎所有的主流資料庫;

  • 靈活的 URL 對映:Django 使用正則表示式管理 URL 對映,靈活性高

  • 豐富的 Template 模板語言:類似 jinjia 模板語言,不但原生功能豐富,還可以自定義模板標籤;

  • 自帶後臺管理系統 admin:只需要通過簡單的幾行配置和程式碼就可以實現一個完整的後臺資料管理控制平臺;

  • 完整的錯誤資訊提示:在開發除錯過程中如果出現執行錯誤或者異常,Django 可以提供非常完整的錯誤資訊幫助定位問題;

  • 豐富的 Django 外掛市場:基於 Django 開發的第三方外掛眾多,簡化站點開發的方方面面,比如實現更為強大的認證系統、更為優雅的 API 介面設計、更為精準的除錯外掛等等。典型代表有 Django Rest Framework 等;

  • 程式碼開源,社群活躍度高:遇到問題可以在社群求助或者直接學習原始碼定位問題。

但是作為一個大而全的 Web 框架,它的缺點也是十分明顯的

  • 框架龐大,不夠精簡、捆綁的內容太多。Flask 正好相反,它是一個精簡的微服務框架,除了 Flask 核心之外,幾乎沒有什麼額外的程式碼。正是捆綁的東西太多,封裝過度導致 Django 內部模組之間相互關聯,耦合度高,不利於改造;

  • Django 在非同步通訊方面做得不好。最近釋出的 3.0 版本中似乎加入了非同步通訊功能,但仍然處於初級開發階段。相比之下 Tornado 框架是非同步通訊功能做得最好的,通常被稱為高效能的 Web 框架。

5. 其他的 Python Web 框架介紹

5.1 Flask

和 Django 直接競爭的 Web 框架莫過於 FlaskTornado 了。Flask 是除了 Django 之外另一個流行的 Python Web 框架。Flask 的設計哲學和 Django 恰恰相反,它不會替開發者做選擇,有且只有一個核心的模組,因此沒有過多的額外功能。

Flask 可以被稱為一個微框架,服務的更多功能會由開發者自行選擇的外掛提供。因此,Flask 的強大第三方市場也使得其與 Django 能在正面上產生競爭。其在 GitHub 上的關注度和社群活躍度與 Django 類似,這也表明越來越多的開發者正在關注著 Flask。Flask 起步比較晚,社群和生態不如 Django 那樣完善,此外它不如 Django 那樣對初學者友好,學習成本相比 Django 要高。

5.2 Tornado

Tornado 與現代主流的 Web 伺服器框架有著明顯的區別:它是非阻塞式的伺服器,速度相當快。這得益於其非阻塞的方式和對 epoll 的運用。Tornado 可以處理數以千計的連線,對於實時 Web 來說 Tornado 確實是一個理想的 Web 框架。但是 Tornado 只適合特定場景的 Web 開發, 它沒有 ORM,也沒有 Session 支援,框架中複用的模組非常少,因此用它開發 Web 服務時,很多功能需要自己定製和編寫,開發速度會比較慢,使用成本高。

6. 本課程學習基礎

本課程的學習除了介紹 Django 框架的基本使用外,後面很多時候我會帶領大家進入 Django 框架的原始碼進行學習,Django 框架的原始碼其實並不是非常複雜,有時候也會有寫的很簡單的部分,我會盡量簡化程式碼帶領大家更深入地學習 Django 框架。因此,為了學好這門課程,我們需要掌握以下幾個基礎知識:

  • 前端基礎:包括 HTML/CSS,JS 程式碼寫的會比較少,但是作為一個 Web 服務開發者,JS 基礎是必要的;

  • Python 基礎:掌握基本的 Python 程式設計知識,然後深入瞭解一些關於魔法函式的知識,這在 Django 的原始碼中會經常用到;

  • 英文基礎:官網文件對 Django 有著非常詳細的描述,幾乎所有的教材、專欄以及個人寫的部落格,包括本專欄都會大量參考官方文件,這是最權威的 Django 資料。希望本課程學習完畢後,你也能繼續到官方網站上繼續學習並閱讀最新的手冊。只有不斷地學習,不斷地翻看和除錯原始碼,不斷實踐,最後才能成為精通 Django 的開發者。

7. 小結

本小節中,我們詳細介紹了 Django 框架以及其提供的功能,然後對比分析 Django 框架的優缺點。最後介紹了其他的 Python Web 框架並同 Django 進行了對比。