- Django實(shí)戰(zhàn):Python Web典型模塊與項(xiàng)目開(kāi)發(fā)
- 張曉
- 8763字
- 2021-01-08 18:09:30
第2章 初識(shí)Django
Django由美國(guó)堪薩斯州勞倫斯市的一個(gè)Web開(kāi)發(fā)團(tuán)隊(duì)用Python寫成,是一個(gè)開(kāi)放源代碼的Web應(yīng)用框架。Django主要用于簡(jiǎn)便、快速地開(kāi)發(fā)數(shù)據(jù)庫(kù)驅(qū)動(dòng)的網(wǎng)站,它主要有以下特點(diǎn)。
●Django采用了MTV設(shè)計(jì)模式,即模型Model、模板Template和視圖View。
●Django強(qiáng)調(diào)代碼復(fù)用,注重組件的重用性和“可插拔性”,注重敏捷開(kāi)發(fā)和DRY(Don't Repeat Yourself)法則。
●Django有許多功能強(qiáng)大的第三方插件,具有很強(qiáng)的可擴(kuò)展性。
●Django使開(kāi)發(fā)復(fù)雜的、數(shù)據(jù)庫(kù)驅(qū)動(dòng)的網(wǎng)站變得簡(jiǎn)單。
本章首先介紹Django的安裝,然后介紹Django的一些基本知識(shí),最后講解Django開(kāi)發(fā)基本流程。
2.1 Django安裝
大多數(shù)程序員在開(kāi)發(fā)過(guò)程中使用Windows,不管程序?qū)?lái)是部署在Windows上,還是Linux上,在開(kāi)發(fā)階段,大家還是習(xí)慣在Windows上進(jìn)行開(kāi)發(fā)、測(cè)試,因此本節(jié)將主要介紹Django在Windows上的開(kāi)發(fā)環(huán)境配置。
Django完全依賴Python環(huán)境,而且由于Django版本、模塊、插件多且復(fù)雜,有時(shí)還需要在虛擬環(huán)境中進(jìn)行開(kāi)發(fā)。因此常規(guī)安裝有3步:第一步是安裝Python,第二步是安裝Python虛擬環(huán)境,第三步是安裝Django。
2.1.1 安裝Python
Python 是一個(gè)跨平臺(tái)的語(yǔ)言,在各種操作系統(tǒng)上都能使用,而且在某個(gè)操作系統(tǒng)上開(kāi)發(fā)的Python程序,在其他操作系統(tǒng)上也能運(yùn)行,這里我們主要講解在Windows上的Python安裝。
Python安裝環(huán)境一般要求Windows 7以上版本,安裝時(shí)需要確定計(jì)算機(jī)上的Windows是64位還是32位,然后訪問(wèn)Python官方網(wǎng)站,單擊Download Python 3.x.x按鈕,進(jìn)入下載頁(yè)面,選擇與操作系統(tǒng)相匹配的安裝程序。下載完成后,雙擊安裝程序文件就開(kāi)始安裝了。安裝過(guò)程與其他軟件安裝過(guò)程相似,要注意的是選擇自定義安裝,并選中“Add Python 3.x to PATH”,安裝結(jié)束后,在命令行終端輸入命令python,如果出現(xiàn)以下字符,說(shuō)明安裝成功。
Microsoft Windows [版本 6.1.7601] 版權(quán)所有 (c) 2009 Microsoft Corporation。保留所有權(quán)利。 C:\Users\Administrator>python Python 3.6.3 (v3.6.3:2c5fed8, Oct 3 2017, 18:11:49) [MSC v.1900 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>>
2.1.2 安裝Python虛擬環(huán)境
在軟件開(kāi)發(fā)與運(yùn)行時(shí),每個(gè)程序都要依賴某些軟件環(huán)境,依賴各種操作系統(tǒng)設(shè)置,如環(huán)境變量、軟件版本等。如果在開(kāi)發(fā)某個(gè)新軟件時(shí),修改了其他軟件依賴的環(huán)境,可能導(dǎo)致其他軟件無(wú)法運(yùn)行。例如,你以前用Django 1.10開(kāi)發(fā)了一些軟件項(xiàng)目,后來(lái)又用Django 2.1.2進(jìn)行開(kāi)發(fā),如果刪除Django 1.10,可能導(dǎo)致原來(lái)開(kāi)發(fā)的項(xiàng)目無(wú)法運(yùn)行。如果你既想讓原來(lái)項(xiàng)目在Django 1.10中運(yùn)行,又想讓新項(xiàng)目在Django 2.1.2上正常運(yùn)行,只有通過(guò)建立Python虛擬環(huán)境來(lái)解決這個(gè)問(wèn)題。虛擬環(huán)境能幫我們從操作系統(tǒng)的Python環(huán)境中復(fù)制一個(gè)全新的Python環(huán)境出來(lái),同時(shí)這個(gè)環(huán)境獨(dú)立于原來(lái)的環(huán)境。
安裝Python虛擬環(huán)境非常簡(jiǎn)單,在命令行終端輸入以下命令。
pip install virtualenv
然后等待軟件下載完成后開(kāi)始安裝配置,這些過(guò)程都是自動(dòng)進(jìn)行的。
提示:pip是Python的軟件包管理工具,是Python自帶的工具軟件。
安裝好virtualenv之后,輸入下述命令創(chuàng)建一個(gè)虛擬環(huán)境。
virtualenv newenv_dir
newenv_dir是虛擬環(huán)境的目錄,運(yùn)行以上命令后,會(huì)在當(dāng)前目錄下生成一個(gè)newenv_dir目錄。
虛擬環(huán)境已經(jīng)創(chuàng)建好了,在命令行終端進(jìn)入newev_dir目錄,再到Scripts文件夾下,運(yùn)行activate程序激活虛擬環(huán)境。
activate
你會(huì)發(fā)現(xiàn)命令提示符變了,如下所示。
(newenv_dir) E:\newev_dir\Scripts>
命令提示符的開(kāi)頭(newenv_dir)是提示正在虛擬環(huán)境中。虛擬環(huán)境激活后,它與其他軟件環(huán)境是隔離開(kāi)的,因此開(kāi)發(fā)程序時(shí)不會(huì)影響系統(tǒng)中的其他軟件,這樣你就可以安裝其他版本的Django或者其他軟件,開(kāi)始新的軟件開(kāi)發(fā)、測(cè)試等工作。
2.1.3 安裝Django
安裝Django非常簡(jiǎn)單,在命令行終端輸入以下命令,等待安裝自動(dòng)完成。
pip install django
也可以指定安裝版本,如下所示,本書(shū)中我們指定用Django 2.1.4進(jìn)行開(kāi)發(fā)。
pip install django==2.1.4
如果在激活的虛擬環(huán)境中安裝,那么這些版本的Django也只在虛擬環(huán)境中運(yùn)行,不會(huì)影響其他軟件,也不會(huì)與其他版本Django沖突。
提示:如果退出虛擬環(huán)境,在虛擬環(huán)境中安裝的軟件、配置的環(huán)境是不能用的,它們像不存在一樣。
2.1.4 測(cè)試安裝效果
如果是在虛擬環(huán)境中安裝的Django,請(qǐng)先激活虛擬環(huán)境,再執(zhí)行命令。如果未在虛擬環(huán)境中安裝,則直接執(zhí)行命令。在命令行終端輸入python命令,啟動(dòng)Python交互式解釋器,試著用import django導(dǎo)入Django,如下所示。
E:\envs\virtualenv_dir\Scripts>python Python 3.6.3 (v3.6.3:2c5fed8, Oct 3 2017, 18:11:49) [MSC v.1900 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> import django >>> django.get_version() '2.1.4' >>>
如果能夠?qū)隓jango并能運(yùn)行相關(guān)命令,說(shuō)明安裝成功。
2.2 Django基本知識(shí)
Django可自動(dòng)實(shí)現(xiàn)Web應(yīng)用的通用功能,減少程序員編碼工作量,“不重復(fù)造輪子”是該框架的設(shè)計(jì)理念。
2.2.1 Django的開(kāi)發(fā)優(yōu)勢(shì)
Django是一個(gè)非常優(yōu)秀的Web開(kāi)發(fā)框架,可以快速構(gòu)建高性能、安全、可維護(hù)、界面優(yōu)秀的網(wǎng)站,Django負(fù)責(zé)處理網(wǎng)站開(kāi)發(fā)中麻煩的部分,使程序員可以專注于編寫應(yīng)用程序業(yè)務(wù)邏輯代碼,而無(wú)須重新開(kāi)發(fā)Web應(yīng)用的通用功能,這就是所謂的“不重復(fù)造輪子”。
Django的開(kāi)發(fā)優(yōu)勢(shì)是非常明顯的,總結(jié)如下。
(1)功能完備:Django提供了“開(kāi)箱即用”的功能,這些功能可以無(wú)縫結(jié)合在一起,并遵循一致性設(shè)計(jì)原則,對(duì)開(kāi)發(fā)人員來(lái)說(shuō)非常重要。Django有完善的ORM、強(qiáng)大的路由映射功能、完善的視圖模板的實(shí)現(xiàn)、強(qiáng)大的緩存支持等。
(2)通用:Django可以構(gòu)建多種類型的網(wǎng)站,可以與許多客戶端框架一起工作,支持并且可以提供多種格式的內(nèi)容,如HTML、RSS(Really Simple Syndication,簡(jiǎn)單信息整合)、JSON (Java Scripe Object Notation,Java Script對(duì)象簡(jiǎn)譜)、XML(Extensible Markup Language,可擴(kuò)展標(biāo)記語(yǔ)言)等格式的內(nèi)容。
(3)安全:Django能夠自動(dòng)保護(hù)網(wǎng)站,避免許多常見(jiàn)的安全錯(cuò)誤。例如要將session放在cookie中這種易受攻擊的方式改變?yōu)橐环N安全的方式,就讓cookies只包含一個(gè)密鑰,實(shí)際數(shù)據(jù)存儲(chǔ)在數(shù)據(jù)庫(kù)中;并用hash()函數(shù)加密用戶密碼。默認(rèn)情況下,Django可以防范許多漏洞,包括SQL(Structur Query Language,結(jié)構(gòu)查詢語(yǔ)言)注入、跨站腳本、CSRF(Cross-Site Request Forgery,跨站請(qǐng)求偽造)、單擊劫持等。
(4)可移植:Django是用Python編寫的,Python能在許多操作系統(tǒng)上運(yùn)行,因此用Django開(kāi)發(fā)的程序不受特定服務(wù)器操作系統(tǒng)的限制,可以在Linux、Windows、mac OS等操作系統(tǒng)上正常運(yùn)行。
(5)自助管理后臺(tái):Django擁有一個(gè)強(qiáng)大的Django Admin管理后臺(tái),用戶幾乎不用寫代碼就擁有一個(gè)完整的后臺(tái)管理頁(yè)面。
2.2.2 Django的MTV設(shè)計(jì)模式簡(jiǎn)介
MVC(Model-View-Controller)設(shè)計(jì)模式的概念存在時(shí)間長(zhǎng),也比較流行,所謂的MVC就是把Web應(yīng)用分為模型(Model)、視圖(View)和控制器(Controller)3層,它們之間以松耦合的方式連接在一起。MVC的通用解釋是采用透明的數(shù)據(jù)存取方式,然后單獨(dú)劃分一層來(lái)顯示數(shù)據(jù),并且加上一個(gè)控制它的層,如下。
(1)模型代表數(shù)據(jù)存取層,它提供數(shù)據(jù)獲取的接口,使模型從數(shù)據(jù)庫(kù)中獲取數(shù)據(jù)時(shí),無(wú)須了解不同數(shù)據(jù)庫(kù)取得數(shù)據(jù)的方式。模型通常會(huì)為數(shù)據(jù)庫(kù)提供一層抽象與封裝,這樣無(wú)須更改代碼就能使用不同的數(shù)據(jù)庫(kù)。
(2)視圖代表界面,是模型的表現(xiàn)層,決定在應(yīng)用中顯示什么和怎么顯示。
(3)控制器負(fù)責(zé)業(yè)務(wù)邏輯,通過(guò)程序邏輯判斷模型決定從數(shù)據(jù)庫(kù)中獲取什么信息,以及把什么信息傳給視圖。
Django也稱得上遵守MVC設(shè)計(jì)模式,但它還有自己的特點(diǎn),它的設(shè)計(jì)模式常被稱作MTV設(shè)計(jì)模型,M指的是數(shù)據(jù)模型(Model),T指的是模板文件(Template),V指的是視圖函數(shù)(View)以及與它有密切關(guān)系的URL配置,現(xiàn)介紹如下。
(1)模型:用來(lái)定義數(shù)據(jù)結(jié)構(gòu)的類,并提供數(shù)據(jù)庫(kù)表管理機(jī)制,主要用來(lái)定義字段的名稱、類型、字段最大值、默認(rèn)值、約束條件等。
下面列舉一段數(shù)據(jù)模型的代碼,給大家一個(gè)初步印象。
from django.db import models # 在此處編寫數(shù)據(jù)模型代碼 # 員工數(shù)據(jù)模型(員工數(shù)據(jù)表) class employee(models.Model): # 員工姓名 name=models.Char Field(max_length=32,verbose_name='姓名') # 員工郵箱 email=models.Email Field(verbose_name='郵箱')
這段代碼展示了一個(gè)非常簡(jiǎn)單的Django數(shù)據(jù)模型,從代碼中可以看到,數(shù)據(jù)模型類必須繼承于models.Model,它在類中定義了兩個(gè)屬性name和email,這兩個(gè)屬性相當(dāng)于數(shù)據(jù)庫(kù)表的字段,它們?yōu)樽址愋停a還設(shè)置了字段的一些約束,如最大長(zhǎng)度、字段顯示名稱等。
(2)模板文件:一般是HTML格式,用于定義文件的結(jié)構(gòu)或布局,并使用占位符表示相關(guān)內(nèi)容,通過(guò)視圖函數(shù)提取數(shù)據(jù)模型的數(shù)據(jù)填充HTML文件的占位符,可以創(chuàng)建動(dòng)態(tài)頁(yè)面。
下面列舉一段模板文件的代碼。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> {{ hello }} </body> </html>
模板文件輸出指定文檔的結(jié)構(gòu),占位符用于表示在生成頁(yè)面時(shí)填充的數(shù)據(jù)。在以上代碼中,{{ hello }}稱為模板變量,是一個(gè)占位符,視圖函數(shù)可以用render()把變量hello傳過(guò)來(lái),在頁(yè)面上顯示時(shí)會(huì)用變量的實(shí)際值替換{{ hello }}。
(3)MTV的V包含視圖函數(shù)以及與它有密切關(guān)系的URL配置。
視圖函數(shù):是一個(gè)處理Web請(qǐng)求的函數(shù),它接收HTTP請(qǐng)求,經(jīng)過(guò)一番處理,返回HTTP響應(yīng)。也就是視圖函數(shù)接收請(qǐng)求后,到數(shù)據(jù)模型里拿到客戶端需要的數(shù)據(jù),把數(shù)據(jù)以一定的格式傳遞給模板文件,然后Django把模板文件以HTTP 響應(yīng)格式發(fā)送給瀏覽器。
下面列舉一段視圖函數(shù)的代碼。
# 導(dǎo)入HTTP相關(guān)模塊 from django.http import Http Response def hello(request): # 前面可以有向數(shù)據(jù)模型請(qǐng)求數(shù)據(jù)的代碼 # 返回響應(yīng) return Http Response('Hello World!')
視圖函數(shù)要求必須接收一個(gè)Http Request對(duì)象作為參數(shù)并返回Http Response對(duì)象,以上代碼只是返回了一個(gè)字符串。
提示:在Django中模塊指的是函數(shù)庫(kù),就是存放多個(gè)函數(shù)的一個(gè)文件。如果我們要在代碼中使用某個(gè)函數(shù),就導(dǎo)入這個(gè)模塊。例如以上代碼,通過(guò)from django.http import HttpResponse導(dǎo)入了HttpResponse,就可以在視圖函數(shù)中使用HttpResponse()函數(shù)了。
URL配置:建立URL與視圖函數(shù)對(duì)應(yīng)關(guān)系,相當(dāng)于URL映射器,主要作用是根據(jù)瀏覽器(客戶端)的URL,將HTTP請(qǐng)求重定向到相應(yīng)的視圖函數(shù)進(jìn)行處理。
下面列舉一段URL配置的代碼。
from django.contrib import admin from django.urls import path from . import views urlpatterns = [ path('admin/', admin.site.urls), path('hello/',views.hello), ]
URL 配置一般存儲(chǔ)在名為urls.py的文件中。在以上代碼示例中,urlpatterns定義了特定URL表達(dá)式和相應(yīng)視圖函數(shù)之間的映射列表,如果接收到具有與指定模式匹配的URL的HTTP請(qǐng)求,則將調(diào)用相關(guān)聯(lián)的視圖函數(shù)(例如views.hello)并傳遞請(qǐng)求。
2.2.3 Django的其他功能
2.2.1節(jié)介紹了Django的主要功能,除此之外,Django還提供了其他的功能或模塊,列舉如下。
●表單:Django通過(guò)表單進(jìn)行數(shù)據(jù)驗(yàn)證和處理。
●用戶身份驗(yàn)證和權(quán)限:Django有一個(gè)強(qiáng)大的、安全性很高的用戶身份驗(yàn)證和權(quán)限系統(tǒng)。
●序列化數(shù)據(jù):Django可以輕松地將數(shù)據(jù)序列化,并支持XML或JSON格式。
●管理后臺(tái):Django Admin管理后臺(tái)使系統(tǒng)管理員能夠輕松創(chuàng)建、編輯和查看網(wǎng)站中的任何數(shù)據(jù)模型,這個(gè)管理后臺(tái)是Django默認(rèn)包含的。
●緩存機(jī)制:Django提供靈活的緩存機(jī)制,可以存儲(chǔ)部分頁(yè)面,提高網(wǎng)頁(yè)響應(yīng)速度。
2.2.4 Django的主要文件
Django按照MTV設(shè)計(jì)模式以松耦合的方式把不同功能分配到各個(gè)文件,這些文件“各司其職”,通過(guò)代碼或配置的方式完成獨(dú)立功能,并與其他文件進(jìn)行協(xié)作。
(1)urls.py是進(jìn)行URL配置的文件,是網(wǎng)址入口,建立URL表達(dá)式與視圖函數(shù)的對(duì)應(yīng)關(guān)系,也就是建立“訪問(wèn)網(wǎng)址就是調(diào)用函數(shù)”的機(jī)制。
(2)views.py是視圖函數(shù)存放模塊,處理用戶發(fā)出的請(qǐng)求。用戶請(qǐng)求從urls.py中的配置項(xiàng)映射過(guò)來(lái),邏輯代碼分析用戶請(qǐng)求后,從數(shù)據(jù)庫(kù)中提取數(shù)據(jù),向templates文件夾中的模板文件傳遞數(shù)據(jù)。
(3)models.py是數(shù)據(jù)模型,定義數(shù)據(jù)表結(jié)構(gòu),是數(shù)據(jù)庫(kù)操作的基礎(chǔ)。
(4)forms.py是Django表單定義文件,通過(guò)表單及字段屬性設(shè)置,生成頁(yè)面文本框,對(duì)用戶提交的數(shù)據(jù)進(jìn)行驗(yàn)證。
(5)templates文件夾中的文件是模板文件,這些文件是視圖函數(shù)渲染改造的對(duì)象,一般是HTML文件,它與視圖函數(shù)共同生成具有動(dòng)態(tài)內(nèi)容的網(wǎng)頁(yè)。
(6)admin.py是管理后臺(tái)配置文件,經(jīng)過(guò)簡(jiǎn)單的配置代碼,就能讓后臺(tái)對(duì)數(shù)據(jù)庫(kù)數(shù)據(jù)進(jìn)行管理。
(7)settings.py是Django配置文件,在文件中可設(shè)置應(yīng)用程序模塊、數(shù)據(jù)庫(kù)類型、中間件等,可以讓各應(yīng)用程序共享配置內(nèi)容。
(8)apps.py是應(yīng)用程序本身的配置文件。
(9)tests.py是用來(lái)編寫單元測(cè)試代碼的文件。
2.3 Django基本開(kāi)發(fā)流程
Django開(kāi)發(fā)環(huán)境搭建好后,就可以進(jìn)入開(kāi)發(fā)流程了。開(kāi)發(fā)的主要工作包括部署開(kāi)發(fā)環(huán)境,創(chuàng)建項(xiàng)目和應(yīng)用程序,編寫業(yè)務(wù)邏輯代碼,建立URL與視圖函數(shù)的對(duì)應(yīng)關(guān)系,根據(jù)項(xiàng)目實(shí)際情況在settings.py文件中進(jìn)行設(shè)置,做好數(shù)據(jù)庫(kù)連接與操作,根據(jù)需要啟動(dòng)Django后臺(tái)管理等。
2.3.1 部署開(kāi)發(fā)環(huán)境
由于Windows普及率高,圖形界面較為友好,因此本節(jié)在Windows 7、Python 3.6.3環(huán)境中講解Django開(kāi)發(fā)環(huán)境部署,在命令行終端輸入以下命令安裝Django。
pip install django
安裝完成后,找到 python 安裝目錄,如果在目錄下的/Python36/Scripts 文件夾中有一個(gè)django-admin.exe文件,就說(shuō)明Django已安裝成功。把scripts文件夾的路徑(形如×:/Python/Python36/ Scripts;)加入操作系統(tǒng)的環(huán)境變量Path中,這樣就可以直接在命令行終端輸入Django命令。
2.3.2 創(chuàng)建項(xiàng)目
選擇一個(gè)目錄放置我們的項(xiàng)目,這里假設(shè)放在test_django目錄下。在命令行終端輸入以下命令。
cd test_django django-admin startproject myproject
第二句命令建立項(xiàng)目myproject,進(jìn)入test_django目錄就會(huì)發(fā)現(xiàn)新增了一個(gè)myproject目錄,即項(xiàng)目myproject的根目錄,這個(gè)目錄的結(jié)構(gòu)如下。
manage.py # 簡(jiǎn)單的命令文件封裝文件,可以通過(guò)這個(gè)文件生成應(yīng)用程序 myproject/ # 一個(gè)目錄,與項(xiàng)目名稱一樣,稱為項(xiàng)目目錄 __init.py__ # 一個(gè)空文件,用來(lái)告訴Python這是myproject目錄的一個(gè)模塊 settings.py # 項(xiàng)目配置文件,包含一些初始化設(shè)置 # 存放URL表達(dá)式的文件,這里定義的每一個(gè)URL都對(duì)應(yīng)一個(gè)視圖函數(shù),這個(gè)文件稱為路由文件 urls.py # 服務(wù)器程序和應(yīng)用程序的一個(gè)協(xié)議接口,規(guī)定了使用的接口和功能,這個(gè)文件不需修改, Django已為項(xiàng)目配置好 wsgi.py
2.3.3 創(chuàng)建應(yīng)用程序
在一個(gè)項(xiàng)目下可以有多個(gè)應(yīng)用程序并實(shí)現(xiàn)不同功能,Django可以根據(jù)需求建立多個(gè)應(yīng)用程序模塊,各個(gè)應(yīng)用程序模塊共享項(xiàng)目的配置環(huán)境,本節(jié)中建立的應(yīng)用程序模塊會(huì)共享/myproject/myproject目錄中settings.py、url.py的配置。
生成應(yīng)用程序非常簡(jiǎn)單,在命令行終端輸入以下命令即可。
cd myproject python manage.py startapp myapp
第二行命令生成應(yīng)用程序模塊,運(yùn)行完成后在/myproject下會(huì)多一個(gè)目錄myapp,該目錄的結(jié)構(gòu)如下。
myapp/ __init__.py admin.py # 配置管理后臺(tái),寫少量代碼就可以啟用Django Admin管理后臺(tái) apps.py: # 存放當(dāng)前應(yīng)用程序的配置 models.py # 存放數(shù)據(jù)庫(kù)相關(guān)的內(nèi)容 tests.py # 可在這個(gè)文件寫測(cè)試代碼以對(duì)當(dāng)前應(yīng)用程序進(jìn)行測(cè)試 views.py # 存放業(yè)務(wù)請(qǐng)求功能的代碼 migrations/ # 這個(gè)文件夾中的文件保存該應(yīng)用程序的數(shù)據(jù)庫(kù)表與變化的相關(guān)內(nèi)容
2.3.4 編寫業(yè)務(wù)邏輯代碼
業(yè)務(wù)邏輯代碼按照Django的約定一般要寫在views.py文件中,換句話說(shuō)就是要在views.py文件中生成一個(gè)視圖函數(shù)并在其中編寫代碼。打開(kāi)/myproject/myapp/views.py,輸入以下命令。
from django.shortcuts import Http Response # 在此處編寫視圖函數(shù)代碼 def index(request): return Http Response('<h1>hello world</h1>')
第一行命令導(dǎo)入Http Response函數(shù),這個(gè)函數(shù)把傳入?yún)?shù)的內(nèi)容顯示在網(wǎng)頁(yè)上。在views.py文件中可以通過(guò)函數(shù)編寫代碼實(shí)現(xiàn)業(yè)務(wù)邏輯,這些函數(shù)被稱為視圖函數(shù)。以上代碼中的index()函數(shù)就是一個(gè)視圖函數(shù),它實(shí)現(xiàn)了在網(wǎng)頁(yè)上顯示hello world的功能。
2.3.5 建立URL與視圖函數(shù)的對(duì)應(yīng)關(guān)系
按照Django的約定,URL與視圖函數(shù)的對(duì)應(yīng)關(guān)系要放在urls.py文件中,對(duì)應(yīng)關(guān)系以URL配置項(xiàng)形式放在文件中的一個(gè)列表變量中。打開(kāi)路由文件urls.py,在urlpattens列表中增加“path('index/', views.index),”建立URL與視圖函數(shù)的對(duì)應(yīng)關(guān)系。path()的第一個(gè)參數(shù)是URL表達(dá)式,用來(lái)匹配網(wǎng)址;第二個(gè)參數(shù)views index指的是views.py文件中的函數(shù)。
提示:URL 表達(dá)式路徑只匹配網(wǎng)址中域名后面的部分。如 index/可以匹配 http://127.0.0.1:8000/index/這個(gè)網(wǎng)址,其中“http://127.0.0.1:8000/”這部分自動(dòng)被忽略。
urls.py文件代碼如下。
from django.contrib import admin from django.urls import path # 導(dǎo)入視圖函數(shù) from myapp import views urlpatterns = [ path('admin/', admin.site.urls), # 指定URL與視圖函數(shù)的對(duì)應(yīng)關(guān)系 path('index/',views.index), path('test/', views.test), ]
以上代碼要用到views.py中的index()函數(shù)和test()函數(shù),因此要在代碼頭部引用包含這兩個(gè)函數(shù)的文件,引用語(yǔ)句為from myapp import views。
到現(xiàn)在為止,我們實(shí)際上已經(jīng)開(kāi)發(fā)了一個(gè)簡(jiǎn)單的網(wǎng)頁(yè)程序,可以通過(guò)命令啟動(dòng)程序,在命令行終端輸入以下命令。
python manage.py runserver
等程序啟動(dòng)完成后,就可以進(jìn)行測(cè)試了,Django 運(yùn)行程序默認(rèn)用到端口 8000,在瀏覽器上輸入http://127.0.0.1:8000/index/進(jìn)行測(cè)試,程序運(yùn)行情況如圖2.1所示。

圖2.1 程序測(cè)試頁(yè)面
2.3.6 動(dòng)態(tài)加載HTML頁(yè)面
前面幾小節(jié)僅生成了一個(gè)簡(jiǎn)單頁(yè)面,沒(méi)有用HTML代碼展現(xiàn)頁(yè)面,僅是一個(gè)樣例,本小節(jié)我們將介紹如何動(dòng)態(tài)加載HTML頁(yè)面。
在項(xiàng)目根目錄/myproject/下新建文件夾,名稱為 templates(這個(gè)名字約定不要修改)。然后在templates文件夾下新建一個(gè)HTML文件作為測(cè)試模板文件,名字為test.html,其代碼如下。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>測(cè)試模板</title> </head> <body> <div align="center"> <h1>{{ hi }}</h1> <hr> <h2>{{ test }}</h2> </div> </body> </html>
這個(gè)HTML文件的代碼非常簡(jiǎn)單,主要是用于測(cè)試,代碼中雙花括號(hào)包括一個(gè)變量,稱為模板變量,形如{{ 變量名 }},注意變量名與雙花括號(hào)之間前后都有空格。Django 模板引擎會(huì)用傳入的值替換這些變量,傳值的代碼寫在/myproject/myapp/views.py文件中,代碼如下。
from django.shortcuts import Http Response,render … def test(request): hi='你好,世界是美好的' test='這是一個(gè)測(cè)試頁(yè),動(dòng)態(tài)頁(yè)面正常顯示,測(cè)試成功!' return render(request,'test.html',{'hi':hi,'test':test})
上述代碼的相關(guān)說(shuō)明如下。
(1)向HTML文件傳遞參數(shù),一般用render()函數(shù),代碼首先要導(dǎo)入render。
(2)最后一行代碼,通過(guò)render()函數(shù)向test.html傳遞模板變量(第3個(gè)參數(shù)),參數(shù)是字典類型,注意字典的key的名字一定與HTML文件中模板變量名一致,并用單引號(hào)括起來(lái)。
模板文件HTML文件寫好后,要讓Django知道文件位置,需要在setttings.py中設(shè)置一下。打開(kāi)/myproject/myproject/setttings.py,找到TEMPLATES代碼塊,修改DIRS值,代碼如下。
# 在本項(xiàng)目中可推導(dǎo)出BASE_DIR值為/myproject/ BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) … TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.Django Templates', # 添加路徑到DIRS列表中 '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', ], }, }, ]
在settings.py中BASE_DIR值為/myproject/,因此DIRS的值為/myproject/templates/, test.html文件正是在這個(gè)目錄下。
在命令行終端輸入python manage.py runserver命令進(jìn)行測(cè)試,運(yùn)行情況如圖2.2所示。

圖2.2 HTML文件載入瀏覽器顯示
2.3.7 配置靜態(tài)文件存放位置
網(wǎng)頁(yè)可以引用圖像、音/視頻、CSS、Java Script等形式的文件,使網(wǎng)頁(yè)更生動(dòng),我們把這些文件存放在一個(gè)文件夾中,即靜態(tài)文件夾。與2.3.6節(jié)同理,要讓Django找到這些文件必須進(jìn)行設(shè)置,首先在setttings.py文件的INSTALLED_APPS代碼塊中要有“'django.contrib.staticfiles',”這一行代碼,如下所示。
INSTALLED_APPS = [ … 'django.contrib.staticfiles', ]
然后在setttings.py文件中增加以下代碼。
STATIC_URL = '/static/' STATICFILES_DIRS=( os.path.join(BASE_DIR,'static'), )
STATIC_URL是靜態(tài)文件夾前綴,STATICFILES_DIRS中的是靜態(tài)文件目錄列表。我們以下面的配置為例做出解釋。
STATIC_URL = '/static/' STATICFILES_DIRS=( 'c:/test1/static1/', 'c:/test2/static2/', 'c:/test3/static3/', )
假如HTML文件中有<script src="/static/jquery-2.2.0.min.js"></script>這一句引用Java Script文件的語(yǔ)句,這個(gè)語(yǔ)句中src以/static/開(kāi)頭。Django在查找jquery-2.2.0.min.js這個(gè)文件時(shí),會(huì)在c:/test1/static1/、c:/test2/static2/、c:/test3/static3/這3個(gè)文件夾中去查找。所以說(shuō)STATIC_URL的值/static/是一個(gè)路徑前綴,可以理解為一個(gè)別名,它代表著STATICFILES_DIRS中列出的文件夾。
我們?cè)O(shè)置靜態(tài)文件夾為 os.path.join(BASE_DIR,'static'),它的真實(shí)值就是/myproject/ static/。因此需要在/myproject/下新建文件夾static,將網(wǎng)頁(yè)要引用的靜態(tài)文件或相關(guān)文件夾保存在這里,如與Bootstrap相關(guān)的CSS、Java Script文件等。
在/myproject/templates文件夾下新建login.html文件,主要代碼如下。
<!-- 導(dǎo)入靜態(tài)文件相關(guān)模塊以及相關(guān)設(shè)置 -- > {% load static %} <!-- 設(shè)置瀏覽器用的字符集是簡(jiǎn)體中文 -- > <html lang="zh-CN"> <head> … <title>登錄頁(yè)面</title> <link href="{% static 'bootstrap/css/bootstrap.min.css' %}" rel="stylesheet"> <link href="{% static 'sigin.css' %}" rel="stylesheet"> <link rel="stylesheet" href="{% static 'fontawesome/css/font-awesome.min.css' %}"> <script src="{% static 'jquery-3.3.1.js' %}"></script> <script src="{% static 'bootstrap/js/bootstrap.min.js' %}"></script> </head> <body> <div class="container"> <form class="form-signin" method="post" action=""> {% csrf_token %} <h2 class="form-signin-heading">請(qǐng)登錄</h2> <p></p> <p></p> <label for="username" class="sr-only">用戶名</label> <input type="text" id="username" name="username" class="form-control"placeholder="用戶" required autofocus> <p></p><p></p> <label for="password" class="sr-only">密 碼</label> <input type="password" id=password" name="password" class="form-control" placeholder="密碼" required> <button class="btn btn-lg btn-primary btn-block" type="submit">登錄</button> </form> </div> <!-- /container --> </body> </html>
上述代碼的相關(guān)說(shuō)明如下。
(1){% name %}這種形式的標(biāo)簽稱為模板標(biāo)簽,可以實(shí)現(xiàn)與函數(shù)、代碼語(yǔ)句相似的功能,后續(xù)章節(jié)將詳細(xì)介紹。
(2){% load static %}表示HTML文件要加載靜態(tài)文件的相關(guān)設(shè)置。例如<link href="{% static 'bootstrap/css/bootstrap.min.css' %}" rel="stylesheet">這句代碼會(huì)被Django渲染成<link href="/static/bootstrap/css/bootstrap.min.css" rel="stylesheet">形式,這樣就指向靜態(tài)文件的位置,而渲染后路徑中的/static/是個(gè)前綴,與settings.py中STATICFILES_DIRS變量結(jié)合起來(lái)形成要查找的路徑。
(3){% csrf_token %}涉及防止跨站請(qǐng)求偽造以及中間件的相關(guān)內(nèi)容,這些Django都為我們?cè)O(shè)計(jì)好了,可直接使用,后續(xù)章節(jié)將詳細(xì)介紹。
(4)<form class="form-signin" method="post" action="">的重點(diǎn)在method屬性,這涉及網(wǎng)頁(yè)提交的方式,最常用的有g(shù)et和post兩種。簡(jiǎn)單地說(shuō),get一般用于請(qǐng)求數(shù)據(jù),post一般用于表單提交數(shù)據(jù)。
接下來(lái)編寫登錄頁(yè)面業(yè)務(wù)邏輯代碼,打開(kāi)/myproject/myapp/views.py,增加以下代碼。
from django.shortcuts import Http Response,render,redirect… def login(request): if request.method == "GET": # 打開(kāi)login.html頁(yè)面 return render(request, "login.html") else: # 從表單提取用戶名 username = request.POST.get('username') # 從表單提取密碼 password = request.POST.get('password') if (username=='test' and password=='123'): # 用戶名與密碼都正確時(shí),定向到test.html渲染的頁(yè)面 return redirect('/test/') else: return render(request, "login.html", {'error': '用戶名或密碼錯(cuò)誤!'})
上述代碼的相關(guān)說(shuō)明如下。
(1)由于要對(duì)載入的HTML文件進(jìn)行渲染并且要用到頁(yè)面重定向功能,代碼首先導(dǎo)入render和redirect模塊。
(2)代碼通過(guò)if request.method =="GET"判斷提交方式。如果是GET,就顯示登錄頁(yè)面;如果是POST,就接收提交數(shù)據(jù)并判斷正誤,如果正確就定向到測(cè)試頁(yè)面。
(3)注意在HTML文件中method值(如post、get)可以是小寫形式,在views.py的代碼中method值必須大寫形式。
(4)如果用戶名與密碼都正確,網(wǎng)頁(yè)定向到測(cè)試頁(yè)面,用return redirect('/test/')實(shí)現(xiàn)。
最后一步添加路由,加上URL與視圖函數(shù)的對(duì)應(yīng)關(guān)系,在/myproject/myproject/urls.py文件中編寫如下代碼。
from myapp.views import index,test,login urlpatterns = [ … path('login/',login), ]
由于用到views.py中的login()函數(shù),第一行代碼導(dǎo)入了login()函數(shù)。
最后測(cè)試成果,進(jìn)入/myproject/目錄,通過(guò)python manage.py runserver啟動(dòng)程序。在瀏覽器上輸入地址進(jìn)行測(cè)試,將得到一個(gè)較美觀的登錄頁(yè)面,如圖2.3所示。

圖2.3 登錄頁(yè)面
正確輸入用戶名與密碼,頁(yè)面進(jìn)入測(cè)試頁(yè)面(如圖2.2所示),就表明程序運(yùn)行正常。
2.3.8 連接數(shù)據(jù)庫(kù)
Django可以稱作面向數(shù)據(jù)的開(kāi)發(fā)框架,用命令生成項(xiàng)目與應(yīng)用程序后,項(xiàng)目根目錄下會(huì)生成一個(gè)默認(rèn)的數(shù)據(jù)庫(kù)db.sqlite3,在settings.py文件中有這個(gè)數(shù)據(jù)庫(kù)的默認(rèn)連接,代碼如下。
DATABASES = { 'default': { # 數(shù)據(jù)庫(kù)引擎,指明數(shù)據(jù)庫(kù)類型 'ENGINE': 'django.db.backends.sqlite3', # 指明數(shù)據(jù)庫(kù)所在位置,本項(xiàng)目中數(shù)據(jù)庫(kù)位置:/myproject/db.sqlites 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } }
提示:Django可以生成數(shù)據(jù)庫(kù)表,不能生成數(shù)據(jù)庫(kù),生成數(shù)據(jù)庫(kù)要用到數(shù)據(jù)庫(kù)原生命令。
以MySQL為例講解數(shù)據(jù)庫(kù)連接,MySQL數(shù)據(jù)庫(kù)安裝本書(shū)不作介紹,請(qǐng)參考其他相關(guān)資料,我們假設(shè)MySQL數(shù)據(jù)庫(kù)已安裝完成。
第一步,安裝Django的MySQL模塊,在命令行終端上輸入以下命令。
pip install pymysql
第二步,在MySQL中建立數(shù)據(jù)庫(kù),通過(guò)root用戶登錄,進(jìn)入MySQL數(shù)據(jù)庫(kù)管理界面,用create database mytest命令建立數(shù)據(jù)庫(kù)mytest。
第三步,在settings.py中設(shè)置DATABASES代碼塊,代碼如下。
DATABASES = { # 'default': { # 'ENGINE': 'django.db.backends.sqlite3', # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), # } 'default': { 'ENGINE': 'django.db.backends.mysql', # 數(shù)據(jù)庫(kù)引擎,指明數(shù)據(jù)庫(kù)類型 'HOST': '127.0.0.1', # 數(shù)據(jù)庫(kù)存儲(chǔ)在本機(jī) 'PORT': '3306', # 端口號(hào) 'NAME': mytest', # 數(shù)據(jù)庫(kù)名稱 'USER': 'root', # 數(shù)據(jù)庫(kù)用戶名 'PASSWORD': 'root', # 數(shù)據(jù)庫(kù)密碼 } }
第四步,在/myproject/myapp/models.py中建立數(shù)據(jù)表,在models.py文件中每個(gè)類生成一個(gè)數(shù)據(jù)表,這里生成一個(gè)用戶信息表User Info,代碼如下。
from django.db import models # 在此處編寫數(shù)據(jù)模型代碼 class User Info(models.Model): user=models.Char Field(max_length=32,verbose_name='姓名') email=models.Email Field(verbose_name='郵箱') def __str__(self): return self.user
上述代碼的相關(guān)說(shuō)明如下。
(1)第一行代碼導(dǎo)入models模塊。
(2)通過(guò)建立User Info類建立User Info數(shù)據(jù)表。
(3)__str__返回模型對(duì)象的描述,可以理解為User Info類的實(shí)例對(duì)象的別名。
第五步,models.py中有了代碼,它所屬的應(yīng)用程序必須在settings.py的INSTALLED_APPS代碼塊中注冊(cè),代碼如下。
INSTALLED_APPS = [ … # 注冊(cè)應(yīng)用程序myapp 'myapp', ]
第六步,在項(xiàng)目目錄/myproject/myproject/__init__.py中編寫以下代碼,指明以pymysql模塊代替MySQLdb模塊,這里要十分注意字母的大小寫。
import pymysql pymysql.install_as_MySQLdb()
運(yùn)行命令生成數(shù)據(jù)表,在命令行終端輸入以下命令。
python manage.py makemigrations python manage.py migrate
登錄MySQL數(shù)據(jù)庫(kù)管理界面,可以看到已經(jīng)生成數(shù)據(jù)表,即圖2.4所示的myaap_userinfo。

圖2.4 在MySQL中生成的數(shù)據(jù)表
提示:Django生成數(shù)據(jù)表時(shí)會(huì)把models.py中的類名轉(zhuǎn)成小寫,然后在前面加上應(yīng)用程序的名字和下劃線,如“myapp_userinfo”。
以auth_和django_開(kāi)頭的數(shù)據(jù)表是Django自動(dòng)生成的系統(tǒng)表,后臺(tái)管理系統(tǒng)會(huì)用到這些表。
2.3.9 Django后臺(tái)管理
本小節(jié)內(nèi)容比較重要,本小節(jié)展示了僅用少量代碼迅速建立一個(gè)功能全面的后臺(tái)管理系統(tǒng)。由此可認(rèn)識(shí)Django強(qiáng)大的功能。
注冊(cè)數(shù)據(jù)庫(kù)表,在/myproject/myapp/admin.py中注冊(cè)models.py生成的數(shù)據(jù)表,代碼如下。
from django.contrib import admin from .models import User Info # 注冊(cè)數(shù)據(jù)庫(kù)表 # 自定義數(shù)據(jù)模型在管理后臺(tái)的顯示樣式 class User Info Admin(admin.Model Admin): # 指明在Django Admin管理后臺(tái)列表模式下顯示哪幾個(gè)字段 list_display=('user','email') admin.site.register(User Info,User Info Admin)
上述代碼的相關(guān)說(shuō)明如下。
(1)list_display表示數(shù)據(jù)列表展示時(shí),顯示哪些字段。
(2)admin.site.register()函數(shù)表示:如果只有一個(gè)參數(shù),以默認(rèn)方式在后臺(tái)顯示或管理數(shù)據(jù)表;如果有第二個(gè)參數(shù),就按第二個(gè)參數(shù)傳入的類定制的方式顯示和管理數(shù)據(jù)表。
為了使后臺(tái)管理系統(tǒng)用中文顯示,需要在settings.py中修改LANGUAGE_CODE、TIME_ZONE兩個(gè)變量,修改的值如下。
LANGUAGE_CODE = 'zh-hans' # 語(yǔ)言格式 TIME_ZONE = 'Asia/Shanghai' # 設(shè)置時(shí)區(qū)
創(chuàng)建后臺(tái)管理超級(jí)用戶,需在命令行終端輸入python manage.py createsuperuser命令,按提示輸入用戶名、電子郵箱地址、密碼等相關(guān)信息,如圖2.5所示。

圖2.5 建立后臺(tái)管理超級(jí)用戶
最后就是驗(yàn)證成果了,在命令行終端輸入python manage.py runserver,用新建的超級(jí)用戶的用戶名和密碼登錄,如圖2.6所示,進(jìn)入后臺(tái)管理系統(tǒng)。
進(jìn)入后臺(tái)管理系統(tǒng)后,就可以對(duì)數(shù)據(jù)表進(jìn)行各類操作與管理,如圖2.7所示。

圖2.6 登錄后臺(tái)管理系統(tǒng)

圖2.7 后臺(tái)管理系統(tǒng)
經(jīng)過(guò)簡(jiǎn)單配置與少量的代碼就建立了功能完善的后臺(tái)管理系統(tǒng)。大家可以按照以上步驟建立一個(gè)系統(tǒng),體驗(yàn)一下Django的強(qiáng)大功能。
2.4 小結(jié)
本章首先簡(jiǎn)要介紹了Django安裝過(guò)程和Django的MTV設(shè)計(jì)模式。接著介紹了Django基本開(kāi)發(fā)流程,讓讀者對(duì)Django開(kāi)發(fā)有整體的、初步的認(rèn)識(shí)。閱讀本章后,讀者可基本了解Django,并能夠成功部署Django開(kāi)發(fā)環(huán)境。
- INSTANT Mock Testing with PowerMock
- C程序設(shè)計(jì)簡(jiǎn)明教程(第二版)
- PWA入門與實(shí)踐
- Java加密與解密的藝術(shù)
- Asynchronous Android Programming(Second Edition)
- Java:High-Performance Apps with Java 9
- Apache Kafka Quick Start Guide
- Babylon.js Essentials
- C# Multithreaded and Parallel Programming
- Advanced Python Programming
- 實(shí)戰(zhàn)Python網(wǎng)絡(luò)爬蟲(chóng)
- Visual Basic程序設(shè)計(jì)基礎(chǔ)
- XML程序設(shè)計(jì)(第二版)
- C/C++程序設(shè)計(jì)教程
- Puppet Cookbook(Third Edition)