第2章 Django入門
之所以會選擇 Django Web 框架來做 Web(接口)開發(fā),除了它功能強(qiáng)大之外,最主要的原因是資料豐富,在我看來這一點(diǎn)對于初學(xué)者尤為重要,如果要學(xué)習(xí)的一項(xiàng)技術(shù)的資料很少,那么在學(xué)習(xí)過程中遇到問題將會很難找到答案,從而容易受挫;相反,如果很容易找到答案,那么學(xué)習(xí)就會變得簡單很多。
Django 是在 BSD 許可證下的開源項(xiàng)目。官方建議在 Python3 的最新版本下使用 Django,但你也可以在Python2.7 版本中使用它。
2.1 Django開發(fā)環(huán)境
Django 的版本大體分為三種:一種是長時(shí)期支持版本(Long Term Support,簡稱 LTS),第二種是最新版本,正式發(fā)布的穩(wěn)定版本;第三種是預(yù)覽版(一般版本號中帶 a1、a2,b1,b2 的標(biāo)識),主要為愿意嘗試新功能的用戶使用。
安裝Django:
pip install django==1.10.3
或者
pip3 install django==1.10.3
或者
python3 -m pip install django=1.10.3
或者
pip install -i https://pypi.douban.com/simple/ django=1.10.3
如果你只安裝一個(gè)版本的 Python,那么第一個(gè)命令即可成功安裝 Django,后兩個(gè)命令是在你同時(shí)安裝了Python2.x 和 Python3.x 兩版本的情況下,用于區(qū)別 Python2.x 時(shí)使用。
當(dāng)然,對于訪問國外網(wǎng)站比較慢的讀者也可以選擇豆瓣源,如第四行命令。
2.2 開始第一個(gè)Demo
按照慣例,我們應(yīng)該先談?wù)撘幌率裁词?Web 框架,以及 Django 的特性和架構(gòu)。但對于新手來說,灌輸這些概念并不能使我們真正的了解 Django,所以,我們先通過一個(gè)簡單的 demo 來體會 Django 是如何工作的。
你可以在操作系統(tǒng)中創(chuàng)建一個(gè) pydj/目錄,用于存放我的練習(xí)項(xiàng)目。筆者在本書中將會在 D:\pydj\目錄來做練習(xí)。
2.2.1 創(chuàng)建項(xiàng)目與應(yīng)用
如果你已經(jīng)成功的安裝 Django,在.../python35/Scripts/目錄中將會多出一個(gè) django-admin.exe 文件。

在Windows 命令提示符下輸入django-admin命令回車。
這里羅列了 Django 所提供給我們的命令,其中使用startproject命令來創(chuàng)建項(xiàng)目。
2.2.1.1使用startproject命令創(chuàng)建guest項(xiàng)目:
django-admin startproject guest #創(chuàng)建 guest 項(xiàng)目
該項(xiàng)目命名為“guest”。項(xiàng)目結(jié)構(gòu)如下:
guest/
|----guest/
| |---- __init__.py
| |---- settings.py
| |---- urls.py
| |---- wsgi.py
|-------- manage.py
其中:
- guest/init.py:一個(gè)空文件,標(biāo)識這是一個(gè)目錄為Python的標(biāo)準(zhǔn)包;
- guest/settings.py: Django項(xiàng)目的配置文件,包括Django模塊應(yīng)用配置、數(shù)據(jù)庫配置、模板配置等;
- guest/urls.py :Django項(xiàng)目的URL聲明;
- guest/wsgi.py:與WSGI兼容的Web服務(wù)器為你的項(xiàng)目提供服務(wù)的切入點(diǎn);
- manage.py:一個(gè)命令行工具,可以讓你在使用Django項(xiàng)目時(shí)以不同的方式進(jìn)行交互。
D:\pydj>cd guest # 進(jìn)入 guest 項(xiàng)目目錄
D:\pydj\guest>python3 manage.py # 查看 manage 所提供的命令
2.2.1.2使用startapp命令創(chuàng)建項(xiàng)目內(nèi)的應(yīng)用:
使用startapp命令創(chuàng)建應(yīng)用。一個(gè)項(xiàng)目可以包含多個(gè)應(yīng)用,而我們要開發(fā)的簽到系統(tǒng)應(yīng)該在具體應(yīng)用下面完成。
python manage.py startapp sign #創(chuàng)建sign項(xiàng)目
創(chuàng)建成功后目錄結(jié)構(gòu)如下:
.
├── guest
│ ├── __init__.py
│ ├── __init__.pyc
│ ├── settings.py
│ ├── settings.pyc
│ ├── urls.py
│ └── wsgi.py
├── manage.py
└── sign
├── migrations
│ ├── __init__.py
├── __init__.py
├── admin.py
├── apps.py
├── models.py
├── tests.py
└── views.py
其中:
- migrations/:用于記錄models中數(shù)據(jù)的變更;
- admin.py:映射models中的數(shù)據(jù)到Django自帶的admin后臺;
- apps.py:用于應(yīng)用程序的配置(在新的Django版本中新增文件);
- models.py: Django的模型文件,創(chuàng)建應(yīng)用程序數(shù)據(jù)表模型(對應(yīng)數(shù)據(jù)庫的相關(guān)操作);
- tests.py:創(chuàng)建Django測試用例;
- views.py: Django的視圖文件,控制向前段頁面顯示的內(nèi)容。
2.2.2運(yùn)行項(xiàng)目
現(xiàn)在我們要把項(xiàng)目運(yùn)行起來,Django 提供了 Web 容器,只需要通過“runserver”命令就可以把項(xiàng)目運(yùn)行起來。
運(yùn)行命令:
python manage.py runserver
Django 默認(rèn)會通過本機(jī)的 8000 端口來啟動項(xiàng)目,如果你的當(dāng)前環(huán)境該端口號被占用了,也可以在啟動時(shí)指定 IP 地址和端口號。
python manage.py runserver 127.0.0.0.1:8001
其中“127.0.0.1”為指向本機(jī)的 IP 地址,“8001”為設(shè)置的端口號。
打開瀏覽器,訪問:http://127.0.0.1:8001/
2.2.3 Hello Django!
大多編程語言的教程,第一個(gè)例子總是會教你如何打印“Hello xxx!”,我們也不免俗套,接下來和我一起開發(fā)一個(gè)“Hello Django!”的頁面。
運(yùn)行“Hello Django”,需要分別做如下修改:
在此之前,我們首先需要配置一下 guest/settings.py 文件,將 sign 應(yīng)用添加到項(xiàng)目中。
-
增加sign應(yīng)用到項(xiàng)目中:在guest/settings.py中增加’sign’到INSTALLED_APPS;
將 sign 應(yīng)用添加到項(xiàng)目中
……
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'sign', #添加 sign 應(yīng)用
]
……
在瀏覽器地址欄輸入:http://127.0.0.1:8001/index/
-
增加/index/的路由配置:在guest/urls.py中增加index路徑;
打開 guest/urls.py 文件添加該目錄
……
from django.conf.urls import url
from django.contrib import admin
from sign import views #導(dǎo)入 sign 應(yīng)用 views 文件
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^index/$', views.index), #添加 index/路徑配置
]
-
增加index屬性:在sign/views.py中增加index屬性;
打開../sign/views.py 文件創(chuàng)建 index 函數(shù)
from django.http import HttpResponse
# Create your views here.
def index(request):
return HttpResponse("Hello Django!")
- 運(yùn)行程序
\guest>python3 manage.py runserver
注意:
Index函數(shù)通過HttpResponse類向客戶端返回指定內(nèi)容“Hello Django”,HttpResponse類在django.http.HttpResponse中,以字符串的形式傳遞給客戶端。
2.2.4使用模板
使用HTML頁面來代替”Hello Django!”字符串:
- 在sign/目錄下創(chuàng)建templates/index.html,包含內(nèi)容如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Django Page</title>
</head>
<body>
<h1>Hello Django!</h1>
</body>
</html>
- 修改sign/views.py中的index函數(shù)為:
from django.shortcuts import render
# Create your views here.
def index(request):
return render(request, "index.html")
這里拋棄 HttpResponse 類 ,轉(zhuǎn)而使用 Django 的 render 函數(shù)。
Render函數(shù)的第一個(gè)參數(shù)是請求對象的,第二個(gè)參數(shù)返回一個(gè) index.html 頁面。
2.3 Django工作流
Django的簡單處理流程:

需要說明的是,這個(gè)處理流程并非 Django 的完整處理過程,其中最主要的就是缺失了數(shù)據(jù)層(model)的操作,但目前我們并沒有涉及這數(shù)據(jù)層的操作,所以先暫時(shí)忽略。
2.3.1URL組成
-
協(xié)議類型HTTP/HTTPS:
HTTP協(xié)議:HyperText Transfer Protocol,超文本傳輸協(xié)議;
HTTPS協(xié)議:HyperText Transfer Protocol over Secure Socket Layer,套接層加密超文本傳輸協(xié)議。是以安全為目標(biāo)的HTTP 通道,簡單講是 HTTP 的安全版。
主機(jī)地址baidu.com:網(wǎng)址或IP地址,通過域名解析服務(wù)器找到對應(yīng)的IP主機(jī)。
-
端口號8000:不同的應(yīng)用使用不同的端口號。
一臺主機(jī)上有很多應(yīng)用,不同的應(yīng)用占用不同的端口號,除了要指定主機(jī)(網(wǎng)址或 IP 地址)之外,還要進(jìn)一步指定相應(yīng)的端口號才能訪問到具體的應(yīng)用。
前面在運(yùn)行 Django 服務(wù)器,默認(rèn)使用 8000 的端口號,所以,在瀏覽器除了輸入 IP 地址之后,還要指向端口號,才能訪問到 Django 應(yīng)用。 路徑/index/ 、/admin/:表示主機(jī)上的一個(gè)目錄或文件地址。
2.3.2URLs的配置
URLconf:URL configuration,為了給一個(gè)應(yīng)用設(shè)計(jì)URL而創(chuàng)建的Python模塊,包含內(nèi)容是URL模式(簡單的正則表達(dá)式)到視圖函數(shù)(默認(rèn)views.py文件中的函數(shù))的映射關(guān)系。
Django處理一個(gè)請求的過程:
- Django使用的是根URLconf模塊,這個(gè)值通常是通過ROOT_URLCONF設(shè)置(settings.py文件):
ROOT_URLCONF = 'guest.urls' - Django加載URLconf模塊(urls.py文件)并尋找可用的urlpatterns。
- Django依次匹配每個(gè)URL模式,在與請求的URL匹配的第一個(gè)模式處停下來。
- 通過匹配的正則,Django將請求指向?qū)?yīng)的視圖函數(shù)處理。
- 如果沒有匹配到正則,或過程中出現(xiàn)異常,Django將調(diào)用適當(dāng)?shù)腻e(cuò)誤處理視圖。

2.3.2views視圖
視圖函數(shù):簡稱視圖,是一個(gè)簡單的Python函數(shù),它接受Web請求并且返回Web響應(yīng)。
Web響應(yīng)可以是:HTML網(wǎng)頁、一個(gè)重定向、一個(gè)404錯(cuò)誤、一個(gè)XML文檔、一張圖片……
視圖在我看來,它在Django 中非常重要,是連接頁面與數(shù)據(jù)的中間紐帶。
拿登錄的例子來講,用戶在頁面上輸入了用戶名和密碼點(diǎn)擊登錄。那么request 請求會由視圖來接收,如何提取出用戶名和密碼的數(shù)據(jù),如何用這些數(shù)據(jù)去查詢數(shù)據(jù)庫,再如何將登錄成功的頁面返回給用戶,這些全部由視圖層來完成。
2.3.4templates模板
打開.../sign/templates/index.html 文件

模板的載體就是我們所熟悉的Web 頁面了,Django 自帶的有模板語言。它的主要作用是如何展示數(shù)據(jù),比如視圖層返回的是一個(gè)字符串,要如何顯示在頁面上;返回的對象數(shù)組要如何顯示等。當(dāng)然,為了使頁面更漂亮需要借助前端技術(shù),比如CSS、JavaScript 等。
2.4 MTV開發(fā)模式
這段話在Django官方文檔也曾出現(xiàn)過:鼓勵(lì)松耦合以及對應(yīng)用程序中不同部分的嚴(yán)格分割。
MVC:Model-View-Controller
- model:數(shù)據(jù)存取層。
- view:表現(xiàn)邏輯,代表的是系統(tǒng)中選擇顯示什么和怎么顯示的部分。
- controller:業(yè)務(wù)邏輯,代表系統(tǒng)中根據(jù)用戶輸入及需要訪問模型,使用哪個(gè)視圖的哪部分。
對應(yīng)到Django后:
- Model:數(shù)據(jù)存取部分,由Django數(shù)據(jù)庫層處理;
- View:表現(xiàn)邏輯,選擇顯示哪些數(shù)據(jù)要顯示以及怎樣顯示的部分,由Django的視圖和模板處理;
- Controller:業(yè)務(wù)邏輯,由Django根據(jù)URLconf設(shè)置,對給定URL調(diào)用適當(dāng)?shù)腜ython函數(shù)。
由于Controller由框架自行處理,而Django里更關(guān)注的是模型(Model)、模板(Template)、視圖(View),因此Django也被稱為MTV框架。
MTV:Model-Template-Views
- Model:模型,數(shù)據(jù)存取層,該層處理與數(shù)據(jù)相關(guān)的所有事務(wù),即如何存取、如果驗(yàn)證有效等;
- Template:模板,表現(xiàn)層,該層處理與表現(xiàn)相關(guān)的所有事務(wù),即如何在頁面或者其他類型文檔中進(jìn)行顯示;
- View:視圖,業(yè)務(wù)邏輯層,該層包含存取模型及調(diào)取恰當(dāng)模板的相關(guān)邏輯,可以看作是模型和模板之間的橋梁。