1 Django概述
????????Web框架,就是用于開發(fā)Web服務(wù)器端應(yīng)用的基礎(chǔ)設(shè)施,說得通俗一點(diǎn)就是一系列封裝好的模塊和工具。事實(shí)上,即便沒有Web框架,我們?nèi)匀豢梢酝ㄟ^socket或CGI來開發(fā)Web服務(wù)器端應(yīng)用,但是這樣做的成本和代價(jià)在商業(yè)項(xiàng)目中通常是不能接受的。通過Web框架,我們可以化繁為簡(jiǎn),降低創(chuàng)建、更新、擴(kuò)展應(yīng)用程序的工作量。剛才我們說到Python有上百個(gè)Web框架,這些框架包括Django、Flask、Tornado、Sanic、Pyramid、Bottle、Web2py、web.py等。
????????在上述Python的Web框架中,Django無疑是最有代表性的重量級(jí)選手,開發(fā)者可以基于Django快速的開發(fā)可靠的Web應(yīng)用程序,因?yàn)樗鼫p少了Web開發(fā)中不必要的開銷,對(duì)常用的設(shè)計(jì)和開發(fā)模式進(jìn)行了封裝,并對(duì)MVC架構(gòu)提供了支持(Django中稱之為MTV架構(gòu))。MVC是軟件系統(tǒng)開發(fā)領(lǐng)域中一種放之四海而皆準(zhǔn)的架構(gòu),它將系統(tǒng)中的組件分為模型(Model)、視圖(View)和控制器(Controller)三個(gè)部分并借此實(shí)現(xiàn)模型(數(shù)據(jù))和視圖(顯示)的解耦合。由于模型和視圖進(jìn)行了分離,所以需要一個(gè)中間人將解耦合的模型和視圖聯(lián)系起來,扮演這個(gè)角色的就是控制器。稍具規(guī)模的軟件系統(tǒng)都會(huì)使用MVC架構(gòu)(或者是從MVC演進(jìn)出的其他架構(gòu)),Django項(xiàng)目中我們稱之為MTV,MTV中的M跟MVC中的M沒有區(qū)別,就是代表數(shù)據(jù)的模型,T代表了網(wǎng)頁(yè)模板(顯示數(shù)據(jù)的視圖),而V代表了視圖函數(shù),在Django框架中,視圖函數(shù)和Django框架本身一起扮演了MVC中C的角色。

- 模型:在程序中用于處理數(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)的視圖。

????????Django 框架的核心組件有:
- 用于創(chuàng)建模型的對(duì)象關(guān)系映射(ORM);
- 基于正則表達(dá)式的 URL 分發(fā)器;
- 視圖系統(tǒng),用于處理 URL 請(qǐng)求;
- 模板系統(tǒng),用于將模板文件轉(zhuǎn)換成 HTML 文件,并在瀏覽器上顯示;
- 緩存系統(tǒng),并提供多種緩存方式。
????????除此之外 Django 框架中還包括如下功能:
- 輕量級(jí)的、獨(dú)立的 Web 服務(wù)器,用于開發(fā)和測(cè)試;
- 表單序列化及驗(yàn)證系統(tǒng) (Form),用于 HTML 表單和數(shù)據(jù)庫(kù)存儲(chǔ)的數(shù)據(jù)之間的轉(zhuǎn)換;
- 中間過濾組件,允許對(duì)請(qǐng)求處理的各個(gè)階段進(jìn)行干涉;
- 序列化系統(tǒng),能夠生成或讀取采用 XML 或 JSON 表示的 Django 模型實(shí)例。
????????此外,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ā)的。
2 基本使用
2.1 安裝Django Web框架
方式一: 使用 pip 安裝Django(不推薦)
????????在命令行中執(zhí)行pip install django=-2.0
命令,即可安裝指定的2.0版本的Django。
方式二: 使用virtualenv安裝Django
????????在多個(gè)項(xiàng)目的復(fù)雜工作中,常常會(huì)碰到使用不同版本的 Python 包,而虛擬環(huán)境則會(huì)處理各個(gè)包之間的隔離問題。virtualenv 是一種虛擬環(huán)境,該環(huán)境中可以安裝 Django,步驟如下:
方式三: 使用 Anaconda 安裝 Django
????????Anaconda 也是一種虛擬環(huán)境,嚴(yán)格來講也是一種包管理工具,安裝王成輸入一下命令創(chuàng)建虛擬環(huán)境:
conda create -n venv1 python=3.6 # 常見名字為 venv1 環(huán)境
conda activate venv1 # 激活環(huán)境
conda install django # 安裝Django
????????下表展示了Django版本和Python版本的對(duì)應(yīng)關(guān)系,請(qǐng)大家自行對(duì)號(hào)入座。
Django版本 | Python版本 |
---|---|
1.8 | 2.7、3.2、3.3、3.4、3.5 |
1.9、1.10 | 2.7、3.4、3.5 |
1.11 | 2.7、3.4、3.5、3.6、3.7(Django 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(Django 2.2.8) |
3.0 | 3.6、3.7、3.8 |
2.2 創(chuàng)建一個(gè) Django 項(xiàng)目
(1) 建立一個(gè)項(xiàng)目文件夾,并激活環(huán)境,使用django-admin
命令創(chuàng)建一個(gè)項(xiàng)目,詳細(xì)如下:
(2) 使用Pycharm/VSCode打開demo項(xiàng)目,查看目錄結(jié)構(gòu),如下圖所示:

????????項(xiàng)目已創(chuàng)建完成,Django項(xiàng)目中的文件及說明如下圖所示:

(3) 在虛擬環(huán)境命令行中執(zhí)行以下命令運(yùn)行項(xiàng)目:
python manage.py runserver
????????此時(shí)可以看到Web服務(wù)器已經(jīng)開始監(jiān)聽8000端口的請(qǐng)求了。在瀏覽器中輸入:“http./127.0.0.1:8000",即可看到創(chuàng)建的Django項(xiàng)目頁(yè)面,如下圖所示。
溫馨提示:
- 這里啟動(dòng)的Django自帶的服務(wù)器只能用于開發(fā)和測(cè)試環(huán)境,因?yàn)檫@個(gè)服務(wù)器是純Python編寫的輕量級(jí)Web服務(wù)器,不適合在生產(chǎn)環(huán)境中使用。
- 如果修改了代碼,不需要為了讓修改的代碼生效而重新啟動(dòng)Django自帶的服務(wù)器。但是,在添加新的項(xiàng)目文件時(shí),該服務(wù)器不會(huì)自動(dòng)重新加載,這個(gè)時(shí)候就得手動(dòng)重啟服務(wù)器。
- 可以在終端中通過python manage.py help命令查看Django管理腳本程序可用的命令參數(shù)。
- 使用python manage.py runserver啟動(dòng)服務(wù)器時(shí),可以在后面添加參數(shù)來指定IP地址和端口號(hào),默認(rèn)情況下啟動(dòng)的服務(wù)器將運(yùn)行在本機(jī)的8000端口。
- 在終端中運(yùn)行的服務(wù)器,可以通過Ctrl+C來停止它 。通過PyCharm的“運(yùn)行配置”運(yùn)行的服務(wù)器直接點(diǎn)擊窗口上的關(guān)閉按鈕就可以終止服務(wù)器的運(yùn)行。
- 不能在同一個(gè)端口上啟動(dòng)多個(gè)服務(wù)器,因?yàn)闀?huì)導(dǎo)致地址的沖突(端口是對(duì)IP地址的擴(kuò)展,也是計(jì)算機(jī)網(wǎng)絡(luò)地址的一部分)。
補(bǔ)充:
????????Django是一個(gè)支持國(guó)際化和本地化的框架,因此剛才我們看到的Django項(xiàng)目的默認(rèn)首頁(yè)也是支持國(guó)際化的,我們可以通過修改配置文件 settings.py
將默認(rèn)語(yǔ)言修改為中文,時(shí)區(qū)設(shè)置為東八區(qū)。
????????修改前為:
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
????????修改后為:
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Chongqing'

(4) 創(chuàng)建完 Django 項(xiàng)目后,在 Pycharm 的命令行執(zhí)行以下命令,可以為 Django 項(xiàng)目生成數(shù)據(jù)表,并創(chuàng)建一個(gè)賬戶名和密碼。
python manage.py migrate # 執(zhí)行數(shù)據(jù)庫(kù)遷移生成數(shù)據(jù)表
python manage.py createsuperuser # 按照提示輸入賬戶和密碼,密碼強(qiáng)度符合一定的規(guī)則要求

(5) 重啟服務(wù)器,在瀏覽器中訪問“http://127.0.0.1:8000/admin”
,使用剛剛創(chuàng)建的賬戶登錄,即可看到后臺(tái)管理界面。

2.3 創(chuàng)建 APP
????????如果要開發(fā)自己的Web應(yīng)用,需要先在Django項(xiàng)目中創(chuàng)建“應(yīng)用”,一個(gè)Django項(xiàng)目可以包含一個(gè)或多個(gè)應(yīng)用,推薦使用 App 來完成不同模塊的任務(wù)。
(1) 通過執(zhí)行如下命令創(chuàng)建名為 app1 的應(yīng)用。
python manage.py startapp app1
????????此時(shí),在項(xiàng)目的根目錄下可以看到一個(gè)名稱為 app1 的目錄。

????????其目錄結(jié)構(gòu)如下所示:
-
__init__.py
:一個(gè)空文件,告訴Python解釋器這個(gè)目錄應(yīng)該被視為一個(gè)Python的包。 -
admin.py
:可以用來注冊(cè)模型,用于在Django框架自帶的管理后臺(tái)中管理模型。 -
apps.py
:當(dāng)前應(yīng)用的配置文件。 -
migrations
:存放與模型有關(guān)的數(shù)據(jù)庫(kù)遷移信息。 -
__init__.py
:一個(gè)空文件,告訴Python解釋器這個(gè)目錄應(yīng)該被視為一個(gè)Python的包。 -
models.py
:存放應(yīng)用的數(shù)據(jù)模型(MTV中的M)。 -
tests.py
:包含測(cè)試應(yīng)用各項(xiàng)功能的測(cè)試類和測(cè)試函數(shù)。 -
views.py
:處理用戶HTTP請(qǐng)求并返回HTTP響應(yīng)的函數(shù)或類(MTV中的V)。
(2) 下面將已經(jīng)創(chuàng)建的 app 添加到 settings.py
配置文件中,然后將其激活,否則 app 內(nèi)的文件都不會(huì)生效,效果如下圖所示。

(3) 修改應(yīng)用目錄下的視圖文件 views.py。
from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
def show_index(request):
return HttpResponse('<h1>Hello, Dingo!</h1>')
????????視圖是接收httprequest
對(duì)象并返回一個(gè)HttpResponse
對(duì)象的Python函數(shù)。接收 request 作為參數(shù)并返回 response 作為結(jié)果。這里定義了一個(gè)簡(jiǎn)單的視圖,命名為show_index
,它只是簡(jiǎn)單地返回一個(gè)信息,一個(gè)字符串Hello, Dingo!。
(4) 修改Django項(xiàng)目目錄下的 urls.py 文件,將視圖函數(shù)和用戶在瀏覽器中請(qǐng)求的路徑對(duì)應(yīng)
from django.contrib import admin
from django.urls import path, include
from app1.views import show_index
urlpatterns = [
path('admin/', admin.site.urls),
path('hello/', show_index),
]
(5) 重新運(yùn)行項(xiàng)目,并打開瀏覽器中訪問 http://127.0.0.1:8000/hello/

(6) 上面我們通過代碼為瀏覽器生成了內(nèi)容,但仍然是靜態(tài)內(nèi)容,如果要生成動(dòng)態(tài)內(nèi)容,可以修改views.py文件并添加如下所示的代碼。
from django.shortcuts import render
from django.http import HttpResponse
from random import sample
# Create your views here.
def show_index(request):
fruits = [
'Apple', 'Orange', 'Pitaya', 'Durian', 'Waxberry', 'Blueberry',
'Grape', 'Peach', 'Pear', 'Banana', 'Watermelon', 'Mango'
]
selected_fruits = sample(fruits, 3)
content = '<h3>今天推薦的水果是:</h3>'
content += '<hr>'
content += '<ul>'
for fruit in selected_fruits:
content += f'<li>{fruit}</li>'
content += '</ul>'
return HttpResponse(content)
(7) 刷新頁(yè)面查看程序的運(yùn)行結(jié)果,看看每次刷新的網(wǎng)頁(yè)的時(shí)候,是不是可以看到不一樣的內(nèi)容

2.4 使用模板
????????上面通過拼接HTML代碼的方式為瀏覽器生成動(dòng)態(tài)內(nèi)容的做法在實(shí)際開發(fā)中是無能接受的,因?yàn)閷?shí)際項(xiàng)目中的前端頁(yè)面可能非常復(fù)雜,無法用這種拼接動(dòng)態(tài)內(nèi)容的方式來完成,這一點(diǎn)大家一定能夠想到。為了解決這個(gè)問題,我們可以提前準(zhǔn)備一個(gè)模板頁(yè)(MTV中的T),所謂模板頁(yè)就是一個(gè)帶占位符和模板指令的HTML頁(yè)面。
????????Django框架中有一個(gè)名為render的便捷函數(shù)可以來完成渲染模板的操作。所謂的渲染就是用數(shù)據(jù)替換掉模板頁(yè)中的模板指令和占位符,當(dāng)然這里的渲染稱為后端渲染,即在服務(wù)器端完成頁(yè)面的渲染再輸出到瀏覽器中。 后端渲染的做法在Web應(yīng)用的訪問量較大時(shí),會(huì)讓服務(wù)器承受較大的負(fù)擔(dān),所以越來越多的Web應(yīng)用會(huì)選擇前端渲染的方式,即服務(wù)器只提供頁(yè)面所需的數(shù)據(jù)(通常是JSON格式),在瀏覽器中通過JavaScript代碼獲取這些數(shù)據(jù)并渲染頁(yè)面上。
????????使用模板頁(yè)的步驟如下所示。
(1) 在項(xiàng)目目錄下創(chuàng)建名為templates文件夾。
(2) 添加模板頁(yè)index.html
????????說明: 實(shí)際項(xiàng)目開發(fā)中,靜態(tài)頁(yè)由前端開發(fā)者提供,后端開發(fā)者需要將靜態(tài)頁(yè)修改為模板頁(yè),以便通過Python程序?qū)ζ溥M(jìn)行渲染,這種做法就是上面提到的后端渲染。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>首頁(yè)</title>
<style>
#fruits {
font-size: 1.25em;
}
</style>
</head>
<body>
<h1>今天推薦的水果是:</h1>
<hr>
<ul id="fruits">
{% for fruit in fruits %}
<li>{{ fruit }}</li>
{% endfor %}
</ul>
</body>
</html>
????????在上面的模板頁(yè)中我們使用了{{ fruit }}
這樣的模板占位符語(yǔ)法,也使用了{% for %}
這樣的模板指令,這些都是Django模板語(yǔ)言(DTL)的一部分。關(guān)于模板語(yǔ)法和指令,大家可以看看Django 模板語(yǔ)言 DTL。
(3) 修改views.py文件,調(diào)用render函數(shù)渲染模板頁(yè)。
from django.shortcuts import render
from django.http import HttpResponse
from random import sample
# Create your views here.
def show_index(request):
fruits = [
'Apple', 'Orange', 'Pitaya', 'Durian', 'Waxberry', 'Blueberry',
'Grape', 'Peach', 'Pear', 'Banana', 'Watermelon', 'Mango'
]
selected_fruits = sample(fruits, 3)
return render(request, 'index.html', {'fruits': selected_fruits})
????????render函數(shù)的第一個(gè)參數(shù)是請(qǐng)求對(duì)象 request,第二個(gè)參數(shù)是我們要渲染的模板頁(yè)的名字,第三個(gè)參數(shù)是要渲染到頁(yè)面上的數(shù)據(jù),我們通過一個(gè)字典將數(shù)據(jù)交給模板頁(yè),字典中的鍵就是模板頁(yè)中使用的模板指令或占位符中的變量名。
(4) 到此為止,視圖函數(shù)中的render還無法找到模板文件index.html
,需要修改settings.py
文件,配置模板文件所在的路徑。修改settings.py
文件,找到TEMPLATES配置,修改其中的DIRS配置。
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates'), ],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
(5) 重新運(yùn)行項(xiàng)目或直接刷新頁(yè)面查看結(jié)果。文章來源:http://www.zghlxwxcb.cn/news/detail-428875.html

至此,通過這個(gè)項(xiàng)目對(duì)Django框架有一個(gè)感性的認(rèn)識(shí)。文章來源地址http://www.zghlxwxcb.cn/news/detail-428875.html
參考
- Django快速上手:https://gitee.com/zengyujin/Python-100-Days/blob/master/Day41-55/41.Django快速上手.md
- Django 框架簡(jiǎn)介:https://www.imooc.com/wiki/djangolesson/djangointroduction.html
到了這里,關(guān)于Python進(jìn)階篇(一)-- Django快速上手的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!