Django 框架簡(jiǎn)介
你好,歡迎來(lái)到這門《Django 框架》教程,這個(gè)教程會(huì)帶你學(xué)習(xí) Python 著名的 Web 開發(fā)框架 Django。這節(jié)課我們會(huì)詳細(xì)介紹 Django 框架的發(fā)展歷程以及 Django 框架的優(yōu)缺點(diǎn),并對(duì)其他 Web 開發(fā)框架做一個(gè)簡(jiǎn)單的對(duì)比。有的同學(xué)可能只學(xué)習(xí)了基礎(chǔ)語(yǔ)法,對(duì)框架的概念不太了解,不用擔(dān)心,你可以先看一下這篇文章,對(duì) Django 框架有一個(gè)大致的了解,后面的小節(jié)我們對(duì) “什么是框架?” 做了詳細(xì)的闡述。
1. MVC 與 MTV 介紹
在 Web 框架中,架構(gòu)模式是其一個(gè)重要的特點(diǎn),往往一個(gè) Web 框架會(huì)在設(shè)計(jì)之初選定好一種架構(gòu)模式,然后開始該模式設(shè)計(jì)和編寫相關(guān)代碼,而 Django 則是基于 MTV 架構(gòu)的模式 。
另一種流行的架構(gòu)模式為 MVC,它在 Java Web 框架中非常流行。MVC 全稱 Model View Controller,即模型 - 視圖 - 控制器。MTV 的全稱是 Model Templates View,即模型 - 模板 - 視圖。MTV 中的名詞解釋如下:
- 模型:在程序中用于處理數(shù)據(jù)邏輯的部分,大部分情況下是對(duì)數(shù)據(jù)庫(kù)的增刪改查的操作;
- 視圖:該層包含存取模型及調(diào)取恰當(dāng)模板的相關(guān)邏輯。用于封裝負(fù)責(zé)處理用戶請(qǐng)求及返回響應(yīng)的邏輯;
- 模板 :用于處理用戶顯示部分的內(nèi)容,和 MVC 中的 V 是一樣的,通過 HTML 展示。它使用模板方法可以動(dòng)態(tài)地生成 HTML。模板包含所需 HTML 輸出的靜態(tài)部分,以及一些特殊的語(yǔ)法,描述如何將動(dòng)態(tài)內(nèi)容插入。
MTV 和 MVC 模式并沒有本質(zhì)上的區(qū)別,都是為了實(shí)現(xiàn)應(yīng)用的解耦,只是定義上有些不同。在 MTV 模式的 Web 框架中,沒有 Controll 層,這個(gè)是由框架內(nèi)部實(shí)現(xiàn),我們需要做的就是將 URL 對(duì)應(yīng)到視圖即可,通過這樣的 URL 配置,系統(tǒng)將一個(gè)請(qǐng)求發(fā)送到一個(gè)合適的視圖進(jìn)行處理。在 Django 框架中就實(shí)現(xiàn)了這樣一個(gè) URL 分發(fā)器,它幫助分發(fā) URL 請(qǐng)求到對(duì)應(yīng)的視圖。
2. Django 框架介紹
首先來(lái)看看 Django 誕生的過程:
Django 是從真實(shí)世界的應(yīng)用中成長(zhǎng)起來(lái)的,它是由堪薩斯(Kansas)州 Lawrence 城中的一個(gè) 網(wǎng)絡(luò)開發(fā)小組編寫的。 它誕生于 2003 年秋天,那時(shí) Lawrence Journal-World 報(bào)紙的程序員 Adrian Holovaty 和 Simon Willison 開始用 Python 來(lái)編寫程序。當(dāng)時(shí)他們的 World Online 小組制作并維護(hù)當(dāng)?shù)氐膸讉€(gè)新聞?wù)军c(diǎn),并在以新聞界特有的快節(jié)奏開發(fā)環(huán)境中逐漸發(fā)展。這些站點(diǎn)包括有 LJWorld.com、Lawrence.com 和 KUsports.com, 記者(或管理層) 要求增加的特征或整個(gè)程序都能在計(jì)劃時(shí)間內(nèi)快速地被建立,這些時(shí)間通常只有幾天或幾個(gè)小時(shí)。 因此,Adrian 和 Simon 開發(fā)了一種節(jié)省時(shí)間的網(wǎng)絡(luò)程序開發(fā)框架, 這是在截止時(shí)間前能完成程序的唯一途徑。2005 年的夏天,當(dāng)這個(gè)框架開發(fā)完成時(shí),它已經(jīng)用來(lái)制作了很多個(gè) World Online 的站點(diǎn)。 當(dāng)時(shí) World Online 小組中的 Jacob Kaplan-Moss 決定把這個(gè)框架發(fā)布為一個(gè)開源軟件,于是 Django 正式出現(xiàn)在大眾眼前,并且得到了快速發(fā)展,原來(lái)的 World Online 的兩個(gè)開發(fā)者(Adrian and Jacob)仍然掌握著 Django,但是其發(fā)展方向受社區(qū)團(tuán)隊(duì)的影響更大。
Django 基于 MTV 模式,其框架示意圖如下:
Django 框架的核心組件有:
除此之外 Django 框架中還包括如下功能:
此外,Django 還內(nèi)置了許多有用的應(yīng)用,比如一個(gè)可擴(kuò)展的認(rèn)證系統(tǒng)、動(dòng)態(tài)站點(diǎn)管理頁(yè)面等等。Django 前身就是在線新聞?wù)军c(diǎn),因此它是非常適合做 Web 站點(diǎn)開發(fā)的。
3. Django 的主要版本
到目前為止,Django 已經(jīng)經(jīng)歷了三個(gè)大的版本,迭代速度之快,令人不得不佩服。不過目前最新的 3.0 版本于 19 年 12 月發(fā)布,還處于快速迭代中,不推薦一開始生產(chǎn)環(huán)境就使用 3.0。下面我們簡(jiǎn)單介紹下 Django 的 1.0 和 2.0 版本之間的主要差別:
支持的 Python 版本:這大概是 Django 1.0 和 2.0 之間一個(gè)最明顯的差別了。參考訪問文檔,如下:
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 的低版本。目前來(lái)看,Python 3 已經(jīng)成了主流,也希望初學(xué)者一開始就使用 Python 3 進(jìn)行編程,不用再糾結(jié)使用 Python 2 還是 Python 3。
-
Django 2 相比 Django 1 簡(jiǎn)化了 URL 路由語(yǔ)法 以及移動(dòng)友好的 contrib.admin;
-
當(dāng)然,更多的是模塊功能代碼上的優(yōu)化和調(diào)整,更多變動(dòng)細(xì)節(jié)可以參考這個(gè)地址。
最后,我們來(lái)看看新發(fā)布的 Django 3.0 相比 Django 2.0 又有哪些新特點(diǎn)呢?
-
支持 MariaDB Django 現(xiàn)在官方支持 MariaDB 10.1 及以上版本;
-
支持 ASGI Django 3.0 已經(jīng)完全支持 async 應(yīng)用了,并提供了部署異步應(yīng)用的說明;
-
在 PostgreSQL 上支持 ExclusionConstraint;
-
Filter 表達(dá)式;
-
model field 的 choices 屬性現(xiàn)在支持自定義枚舉類型;
-
一些小變更,就不一一列舉了,大家可以參考官方的 release 信息。
總而言之,Django 1.0 已經(jīng)逐漸退出歷史舞臺(tái),2.0 版本是主流,3.0 則是未來(lái)。
4. Django 框架優(yōu)缺點(diǎn)
Django 框架作為一個(gè)流行的 Web 框架,其優(yōu)勢(shì)如下:
-
功能完善,文檔手冊(cè)豐富,可以說是應(yīng)有盡有。而且自帶大量常用工具和底層封裝;
-
強(qiáng)大的數(shù)據(jù)庫(kù)訪問組件:開發(fā)者可以無(wú)差別使用各種數(shù)據(jù)庫(kù),如 SQLite、MySQL 和 oracle 等幾乎所有的主流數(shù)據(jù)庫(kù);
-
靈活的 URL 映射:Django 使用正則表達(dá)式管理 URL 映射,靈活性高
-
豐富的 Template 模板語(yǔ)言:類似 jinjia 模板語(yǔ)言,不但原生功能豐富,還可以自定義模板標(biāo)簽;
-
自帶后臺(tái)管理系統(tǒng) admin:只需要通過簡(jiǎn)單的幾行配置和代碼就可以實(shí)現(xiàn)一個(gè)完整的后臺(tái)數(shù)據(jù)管理控制平臺(tái);
-
完整的錯(cuò)誤信息提示:在開發(fā)調(diào)試過程中如果出現(xiàn)運(yùn)行錯(cuò)誤或者異常,Django 可以提供非常完整的錯(cuò)誤信息幫助定位問題;
-
豐富的 Django 插件市場(chǎng):基于 Django 開發(fā)的第三方插件眾多,簡(jiǎn)化站點(diǎn)開發(fā)的方方面面,比如實(shí)現(xiàn)更為強(qiáng)大的認(rèn)證系統(tǒng)、更為優(yōu)雅的 API 接口設(shè)計(jì)、更為精準(zhǔn)的調(diào)試插件等等。典型代表有 Django Rest Framework 等;
-
代碼開源,社區(qū)活躍度高:遇到問題可以在社區(qū)求助或者直接學(xué)習(xí)源碼定位問題。
但是作為一個(gè)大而全的 Web 框架,它的缺點(diǎn)也是十分明顯的:
-
框架龐大,不夠精簡(jiǎn)、捆綁的內(nèi)容太多。Flask 正好相反,它是一個(gè)精簡(jiǎn)的微服務(wù)框架,除了 Flask 核心之外,幾乎沒有什么額外的代碼。正是捆綁的東西太多,封裝過度導(dǎo)致 Django 內(nèi)部模塊之間相互關(guān)聯(lián),耦合度高,不利于改造;
-
Django 在異步通信方面做得不好。最近發(fā)布的 3.0 版本中似乎加入了異步通信功能,但仍然處于初級(jí)開發(fā)階段。相比之下 Tornado 框架是異步通信功能做得最好的,通常被稱為高性能的 Web 框架。
5. 其他的 Python Web 框架介紹
5.1 Flask
和 Django 直接競(jìng)爭(zhēng)的 Web 框架莫過于 Flask 和 Tornado 了。Flask 是除了 Django 之外另一個(gè)流行的 Python Web 框架。Flask 的設(shè)計(jì)哲學(xué)和 Django 恰恰相反,它不會(huì)替開發(fā)者做選擇,有且只有一個(gè)核心的模塊,因此沒有過多的額外功能。
Flask 可以被稱為一個(gè)微框架,服務(wù)的更多功能會(huì)由開發(fā)者自行選擇的插件提供。因此,F(xiàn)lask 的強(qiáng)大第三方市場(chǎng)也使得其與 Django 能在正面上產(chǎn)生競(jìng)爭(zhēng)。其在 GitHub 上的關(guān)注度和社區(qū)活躍度與 Django 類似,這也表明越來(lái)越多的開發(fā)者正在關(guān)注著 Flask。Flask 起步比較晚,社區(qū)和生態(tài)不如 Django 那樣完善,此外它不如 Django 那樣對(duì)初學(xué)者友好,學(xué)習(xí)成本相比 Django 要高。
5.2 Tornado
Tornado 與現(xiàn)代主流的 Web 服務(wù)器框架有著明顯的區(qū)別:它是非阻塞式的服務(wù)器,速度相當(dāng)快。這得益于其非阻塞的方式和對(duì) epoll 的運(yùn)用。Tornado 可以處理數(shù)以千計(jì)的連接,對(duì)于實(shí)時(shí) Web 來(lái)說 Tornado 確實(shí)是一個(gè)理想的 Web 框架。但是 Tornado 只適合特定場(chǎng)景的 Web 開發(fā), 它沒有 ORM,也沒有 Session 支持,框架中復(fù)用的模塊非常少,因此用它開發(fā) Web 服務(wù)時(shí),很多功能需要自己定制和編寫,開發(fā)速度會(huì)比較慢,使用成本高。
6. 本課程學(xué)習(xí)基礎(chǔ)
本課程的學(xué)習(xí)除了介紹 Django 框架的基本使用外,后面很多時(shí)候我會(huì)帶領(lǐng)大家進(jìn)入 Django 框架的源碼進(jìn)行學(xué)習(xí),Django 框架的源碼其實(shí)并不是非常復(fù)雜,有時(shí)候也會(huì)有寫的很簡(jiǎn)單的部分,我會(huì)盡量簡(jiǎn)化代碼帶領(lǐng)大家更深入地學(xué)習(xí) Django 框架。因此,為了學(xué)好這門課程,我們需要掌握以下幾個(gè)基礎(chǔ)知識(shí):
-
前端基礎(chǔ):包括 HTML/CSS,JS 代碼寫的會(huì)比較少,但是作為一個(gè) Web 服務(wù)開發(fā)者,JS 基礎(chǔ)是必要的;
-
Python 基礎(chǔ):掌握基本的 Python 編程知識(shí),然后深入了解一些關(guān)于魔法函數(shù)的知識(shí),這在 Django 的源碼中會(huì)經(jīng)常用到;
-
英文基礎(chǔ):官網(wǎng)文檔對(duì) Django 有著非常詳細(xì)的描述,幾乎所有的教材、專欄以及個(gè)人寫的博客,包括本專欄都會(huì)大量參考官方文檔,這是最權(quán)威的 Django 資料。希望本課程學(xué)習(xí)完畢后,你也能繼續(xù)到官方網(wǎng)站上繼續(xù)學(xué)習(xí)并閱讀最新的手冊(cè)。只有不斷地學(xué)習(xí),不斷地翻看和調(diào)試源碼,不斷實(shí)踐,最后才能成為精通 Django 的開發(fā)者。
7. 小結(jié)
本小節(jié)中,我們?cè)敿?xì)介紹了 Django 框架以及其提供的功能,然后對(duì)比分析 Django 框架的優(yōu)缺點(diǎn)。最后介紹了其他的 Python Web 框架并同 Django 進(jìn)行了對(duì)比。