?序言
作為一個(gè)測(cè)試人員如果你有以下疑問(wèn)勘究,那么這篇文章將對(duì)你有很大幫助躏尉!
1.網(wǎng)站的業(yè)務(wù)功能是如何實(shí)現(xiàn)的酌泰?參考章節(jié):視圖配置-實(shí)現(xiàn)網(wǎng)站業(yè)務(wù)功能
2.服務(wù)器如何解析瀏覽器中的url顾腊?參考章節(jié)URL配置-提供url鏈接
3.瀏覽器中的網(wǎng)頁(yè)是如何展現(xiàn)給大家的状勤?參考章節(jié):模板-html頁(yè)面的展示
4.服務(wù)器如何與數(shù)據(jù)庫(kù)交互?參考章節(jié):模型-操控Mysql數(shù)據(jù)庫(kù)
Django概要介紹
Django是一個(gè)開(kāi)放源代碼的Web應(yīng)用框架畏铆,由Python寫(xiě)成雷袋。Django遵循 MVC 設(shè)計(jì)模式的框架。MVC是Model辞居、View楷怒、Controller三個(gè)單詞的簡(jiǎn)寫(xiě),分別代表模型瓦灶、視圖率寡、控制器。Django其實(shí)也是一個(gè)MTV 的設(shè)計(jì)模式倚搬。MTV是Model冶共、Template、View三個(gè)單詞的簡(jiǎn)寫(xiě)每界,分別代表模型捅僵、模版、視圖? 眨层。但是在Django中庙楚,控制器接受用戶(hù)輸入的部分由框架自行處理,所以 Django 里更關(guān)注的是模型(Model)趴樱、模板(Template)和視圖(Views)馒闷,稱(chēng)為 MTV模式酪捡。它們各自的職責(zé)如下:
模型(Model),即數(shù)據(jù)存取層處理與數(shù)據(jù)相關(guān)的所有事務(wù):? 如何存取纳账、如何驗(yàn)證有效性逛薇、包含哪些行為以及數(shù)據(jù)之間的關(guān)系等。
模板(Template)疏虫,即表現(xiàn)層處理與表現(xiàn)相關(guān)的決定:? 如何在頁(yè)面或其他類(lèi)型文檔中進(jìn)行顯示永罚。
視圖(View),即業(yè)務(wù)邏輯層存取模型及調(diào)取恰當(dāng)模板的相關(guān)邏輯卧秘。模型與模板的橋梁呢袱。
Django是實(shí)現(xiàn)了WSGI協(xié)議的web框架,WSGI的全稱(chēng)是Web Server Gateway Interface翅敌。具體來(lái)說(shuō)羞福,WSGI是一個(gè)規(guī)范,定義了Web服務(wù)器如何與Python應(yīng)用程序進(jìn)行交互蚯涮,使得使用Python寫(xiě)的Web應(yīng)用程序可以和Web服務(wù)器對(duì)接起來(lái)治专,至于代碼的實(shí)現(xiàn)細(xì)節(jié)這里就不做詳細(xì)介紹了魁亦。
架構(gòu)圖
安裝
pip install Django 也可以使用阿里鏡像
pip install Django -i https://pypi.tuna.tsinghua.edu.cn/simple
創(chuàng)建項(xiàng)目
在cmd窗口中 運(yùn)行 django-admin startproject testdj
備注:安裝好Django 后单寂,django-admin.exe被安裝到C:\Python37\Scripts目錄
項(xiàng)目說(shuō)明:
testdj: 項(xiàng)目的容器独令。
manage.py: 一個(gè)實(shí)用的命令行工具,可讓你以各種方式與該 Django 項(xiàng)目進(jìn)行交互液肌。
testdj /__init__.py: 一個(gè)空文件,告訴 Python 該目錄是一個(gè) Python 包鸥滨。
testdj /settings.py: 該 Django 項(xiàng)目的設(shè)置/配置嗦哆。
testdj /urls.py: 該 Django 項(xiàng)目的 URL 聲明; 一份由 Django 驅(qū)動(dòng)的網(wǎng)站"目錄"。
testdj /wsgi.py: 一個(gè) WSGI 兼容的 Web 服務(wù)器的入口婿滓,以便運(yùn)行你的項(xiàng)目老速。
Pycharm配置
在pycharm中導(dǎo)入項(xiàng)目testdj,進(jìn)入運(yùn)行置凸主,如下圖:
環(huán)境測(cè)試
然后運(yùn)行項(xiàng)目橘券,在瀏覽器中輸入127.0.0.1:8000 ,如下圖所示
視圖配置-實(shí)現(xiàn)網(wǎng)站業(yè)務(wù)功能
視圖:即一個(gè)python函數(shù),可以叫視圖函數(shù)卿吐,或者簡(jiǎn)稱(chēng) 視圖旁舰,定義在 應(yīng)用/views.py 文件中。它的作用是接收處理請(qǐng)求并響應(yīng)請(qǐng)求嗡官,每一個(gè)用戶(hù)請(qǐng)求箭窜,都對(duì)應(yīng)著一個(gè)視圖(和url地址),由視圖處理請(qǐng)求后衍腥,再返回html頁(yè)面內(nèi)容給瀏覽器顯示磺樱。
在先前創(chuàng)建的testdj目錄下的testdj目錄新建一個(gè) view.py 文件纳猫,并輸入代碼:
from django.http import HttpResponse
from django.shortcuts import render
def hello(request):
????? return HttpResponse("Hello world ! ")
URL配置-提供url鏈接
綁定 URL 與視圖函數(shù)。即輸入url后,完成與之對(duì)應(yīng)的視圖函數(shù)的調(diào)用竹捉。
打開(kāi) urls.py 文件芜辕,刪除原來(lái)代碼,將以下代碼復(fù)制粘貼到 urls.py 文件中:
from django.conf.urls import url
from testdj import view
urlpatterns= [
??? url(r'^$', view.hello) #視圖配置章節(jié)中定義的視圖函數(shù)
]
重新啟動(dòng)Django服務(wù)器活孩,輸入127.0.0.1:8000,瀏覽器顯示如下:
模板-html頁(yè)面的展示
模板是一個(gè)文本物遇,用于分離文檔的表現(xiàn)形式和內(nèi)容。
在testdj應(yīng)用下面創(chuàng)建一個(gè)目錄templates憾儒,然后可以在該目錄下放置html文件询兴,如下圖所示:
在hello.html 文件中添加代碼如下:
<h1>{{ hello}}</h1>
在setting.py中設(shè)置templates的位置
TEMPLATES = [
??? {
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS':[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',
??????????? ],
??????? },
??? },
]
我們現(xiàn)在修改 view.py,增加一個(gè)新的對(duì)象起趾,用于向模板提交數(shù)據(jù):
def hello (request):
??? context????????? = {}
??? context['hello']= 'Hello World!'
??? return render(request,'hello.html', context)
重啟Django服務(wù)器诗舰,輸入127.0.0.1:8000/hello,瀏覽器顯示如下:
可見(jiàn)我們成功的把“Hello World!”賦值給了hello.html中的變量{{ hello}}
Django中服務(wù)器給瀏覽器返回?cái)?shù)據(jù)主要通過(guò)函數(shù)HttpResponse训裆、render和redirect
HttpResponse
它是作用是內(nèi)部傳入一個(gè)字符串參數(shù)眶根,然后發(fā)給瀏覽器。例如:
return HttpResponse("Hello world ! ")
render
render方法可接收三個(gè)參數(shù)边琉,一是request參數(shù)属百,二是待渲染的html模板文件,三是保存具體數(shù)據(jù)的字典參數(shù)。它的作用就是將數(shù)據(jù)填充進(jìn)模板文件变姨,最后把結(jié)果返回給瀏覽器族扰。例如:
context????????? = {}
context['hello'] = 'Hello World!'
return render(request, 'hello.html', context)
redirect
接受一個(gè)URL參數(shù),表示讓瀏覽器跳轉(zhuǎn)去指定的URL定欧。例如:
return redirect("https://www.baidu.com")
模型-操控Mysql數(shù)據(jù)庫(kù)
Client的安裝
pip install mysqlclient
配置文件設(shè)置db信息
在testdj /settings.py: 設(shè)置db連接信息
DATABASES = {
'default':
{
'ENGINE': 'django.db.backends.mysql', # 或者使用mysql.connector.django
'NAME': 'test',
'USER': 'test',
'PASSWORD': '123456',
'HOST':127.0.0.1,
'PORT':'3306',
}
?}
配置模型
創(chuàng)建應(yīng)用
Django規(guī)定渔呵,如果要使用模型,必須要?jiǎng)?chuàng)建一個(gè)應(yīng)用砍鸠。我們使用以下命令創(chuàng)建應(yīng)用DjModel扩氢。
django-admin startapp DjModel
修改models.py
我們修改DjModel/models.py 文件,代碼如下:
# models.py
from django.db import models
class Test(models.Model):
???? title= models.CharField('標(biāo)題', max_length=200, unique=True)
???? body= models.TextField('正文')
以上的類(lèi)名代表了數(shù)據(jù)庫(kù)表名爷辱,且繼承了models.Model录豺,類(lèi)里面的字段代表數(shù)據(jù)表中的字段(name),數(shù)據(jù)類(lèi)型則是CharField和TextField饭弓,max_length 參數(shù)限定長(zhǎng)度巩检。
在配置文件中添加model應(yīng)用
接下來(lái)在settings.py中找到INSTALLED_APPS這一項(xiàng),如下:
INSTALLED_APPS= (
??? 'django.contrib.admin',
??? 'django.contrib.auth',
??? 'django.contrib.contenttypes',
??? 'django.contrib.sessions',
??? 'django.contrib.messages',
??? 'django.contrib.staticfiles',
??? 'DjModel',?????????????? #添加此項(xiàng)
)
創(chuàng)建表結(jié)構(gòu)并與數(shù)據(jù)庫(kù)信息同步
在命令中運(yùn)行如下命令
$python manage.py migrate?? #創(chuàng)建表結(jié)構(gòu)
$python manage.py makemigrations TestModel?#讓 Django 知道我們?cè)谖覀兊哪P陀幸恍┳兏?/p>
$python manage.py migrate TestModel?? #創(chuàng)建表結(jié)構(gòu)
makemigrations 和 migrate命令
makemigrations和migrate 工作原理分別是什么:
makemigrations:根據(jù)檢測(cè)到的模型創(chuàng)建新的遷移示启。遷移的作用兢哭,更多的是將數(shù)據(jù)庫(kù)的操作,以文件的形式記錄下來(lái)夫嗓,方便以后檢查迟螺、調(diào)用冲秽、重做等等。執(zhí)行makemigrations命令會(huì)在該app下建立 migrations目錄矩父,并記錄下你所有的關(guān)于modes.py的改動(dòng)锉桑,比如0001_initial.py。
migrate:使數(shù)據(jù)庫(kù)狀態(tài)與當(dāng)前模型集和遷移集同步窍株。說(shuō)白了民轴,就是將對(duì)數(shù)據(jù)庫(kù)的更改,主要是數(shù)據(jù)表設(shè)計(jì)的更改球订,在數(shù)據(jù)庫(kù)中真實(shí)執(zhí)行后裸。例如,新建冒滩、修改微驶、刪除數(shù)據(jù)表,新增开睡、修改因苹、刪除某數(shù)據(jù)表內(nèi)的字段等等。
Django模型中的API超控?cái)?shù)據(jù)庫(kù)
增
增即創(chuàng)建新的對(duì)象或添加新的條目篇恒。如果我們要給數(shù)據(jù)庫(kù)添加一篇新的文章扶檐,Django提供了2種常見(jiàn)操作方式。
方法一胁艰,傳統(tǒng)save方法款筑。
obj =Test(title="My first Test", body="My first Test body")
obj.save()
注意: 該方法如果不選擇save(), 創(chuàng)建的對(duì)象將不會(huì)保存到數(shù)據(jù)庫(kù)中去。正因?yàn)槿绱嘶茸拢珼jango還提供了更便捷的create方法醋虏。
方法二寻咒,便捷的create方法哮翘。
Test.objects.create(title="Myfirst Test", body="My first Test body")
注意: 對(duì)Django自帶auth模塊中的User模型操作,比如創(chuàng)建新的用戶(hù)時(shí)毛秘,請(qǐng)用create_user方法饭寺。該方法會(huì)將密碼自動(dòng)加Hash存儲(chǔ)到數(shù)據(jù)庫(kù)中。
fromdjango.contrib.auth.models import User
user =User.objects.create_user(username='john',
????????????????????????????????email='john@gmail.com',
????????????????????????????????password='somepwd')
刪
刪即刪除一個(gè)已有對(duì)象或從表中刪除一個(gè)已有條目叫挟。Django也允許同時(shí)刪除多個(gè)對(duì)象或條目艰匙。
案例一,刪除所有文章(請(qǐng)慎用D摇T蹦)
Test.objects.all().delete()
案例二,刪除標(biāo)題里含有python的所有文章(不區(qū)分大小寫(xiě))
Test.objects.filter(title__icontains="python").delete()
改
改既可以用save方法奋献,也可以用update方法健霹。其區(qū)別在于save方法不僅可以更新數(shù)據(jù)中現(xiàn)有對(duì)象數(shù)據(jù)旺上,還可以創(chuàng)建新的對(duì)象。而update方法只能用于更新已有對(duì)象數(shù)據(jù)糖埋。一般來(lái)說(shuō)宣吱,如果要同時(shí)更新多個(gè)對(duì)象數(shù)據(jù),用update方法更合適瞳别。
案例一征候,利用save方法更新某一文章標(biāo)題
Test =Test.objects.get(id=1)
Test.title= "New Test title"
Test.save()
案例二,利用update方法更新某一文章標(biāo)題
Test =Test.objects.get(id=1).update(title='new title')
案例三祟敛,利用update方法更新多篇文章標(biāo)題
Test =Test.objects.filter(title__icontains='python').update(title='Django')
查
Django對(duì)于數(shù)據(jù)庫(kù)的查詢(xún)主要是get和filter等方法疤坝。我們來(lái)看幾個(gè)案例。
案例一垒棋,查詢(xún)所有數(shù)據(jù)
Test.objects.all()
Test.objects.all().values()
# 只獲取title列表-字典形式
Test.objects.all().values('title')
# 只獲取title列表- 元組形式卒煞,只有value,沒(méi)有key
Test.objects.all().values_list('title')
注意:使用values和values_list可以減少數(shù)據(jù)庫(kù)查詢(xún)工作量叼架。如果只需要在模板中使用某些字段畔裕,而不是全部字段,建議使用values和values_list乖订。
案例二扮饶,查詢(xún)某一條數(shù)據(jù)
Test.objects.get(id=1)
案例三,模糊查詢(xún)返回?cái)?shù)據(jù)集, 并去重
Test.objects.filter(title__icontains='python').distinct()
Django執(zhí)行自定義sql
導(dǎo)入form django.db import connection,transaction
django.db.connection:代表默認(rèn)的數(shù)據(jù)庫(kù)連接
django.db.transaction:代表默認(rèn)數(shù)據(jù)庫(kù)事務(wù)(transaction)
connection.cursor(): 獲得一個(gè)游標(biāo)(cursor)對(duì)象
cursor.execute(sql, [params]):執(zhí)行sql
cursor.fetchone():獲取一個(gè)對(duì)象數(shù)據(jù)
cursor.fetchall():返回結(jié)果行
如果執(zhí)行修改操作乍构,則調(diào)用transaction.commit_unless_managed()來(lái)保證你的更改提交到數(shù)據(jù)庫(kù)甜无。
例如:
sql = 'SELECT * FROM `djangomodel_test2` WHERE? `djangomodel_test2`.`name`="kevin"'
cursor = connection.cursor ()
cursor.execute (sql)
fetchall = cursor.fetchall ()