(02)《Web接口開發(fā)與自動化測試基于Python語言》--第2章

第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 文件。

image.png

在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)目中。

  1. 增加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/

  1. 增加/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/路徑配置
]
  1. 增加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!")
  1. 運(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的簡單處理流程:

image.png

需要說明的是,這個(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è)請求的過程:

  1. Django使用的是根URLconf模塊,這個(gè)值通常是通過ROOT_URLCONF設(shè)置(settings.py文件):
    ROOT_URLCONF = 'guest.urls'
  2. Django加載URLconf模塊(urls.py文件)并尋找可用的urlpatterns。
  3. Django依次匹配每個(gè)URL模式,在與請求的URL匹配的第一個(gè)模式處停下來。
  4. 通過匹配的正則,Django將請求指向?qū)?yīng)的視圖函數(shù)處理。
  5. 如果沒有匹配到正則,或過程中出現(xiàn)異常,Django將調(diào)用適當(dāng)?shù)腻e(cuò)誤處理視圖。
image.png

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 文件

image.png

模板的載體就是我們所熟悉的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)邏輯,可以看作是模型和模板之間的橋梁。

參考

http://blog.csdn.net/zhaoxz1985/article/details/72862466

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容