測(cè)試人員快速上手Django指南

?序言

作為一個(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 ()

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市哥遮,隨后出現(xiàn)的幾起案子岂丘,更是在濱河造成了極大的恐慌,老刑警劉巖眠饮,帶你破解...
    沈念sama閱讀 211,817評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件奥帘,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡仪召,警方通過(guò)查閱死者的電腦和手機(jī)寨蹋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)扔茅,“玉大人已旧,你說(shuō)我怎么就攤上這事≌倌龋” “怎么了运褪?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,354評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我秸讹,道長(zhǎng)胁后,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,498評(píng)論 1 284
  • 正文 為了忘掉前任嗦枢,我火速辦了婚禮攀芯,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘文虏。我一直安慰自己侣诺,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布氧秘。 她就那樣靜靜地躺著年鸳,像睡著了一般。 火紅的嫁衣襯著肌膚如雪丸相。 梳的紋絲不亂的頭發(fā)上搔确,一...
    開(kāi)封第一講書(shū)人閱讀 49,829評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音灭忠,去河邊找鬼膳算。 笑死,一個(gè)胖子當(dāng)著我的面吹牛弛作,可吹牛的內(nèi)容都是我干的涕蜂。 我是一名探鬼主播,決...
    沈念sama閱讀 38,979評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼映琳,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼机隙!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起萨西,我...
    開(kāi)封第一講書(shū)人閱讀 37,722評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤有鹿,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后谎脯,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體葱跋,經(jīng)...
    沈念sama閱讀 44,189評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評(píng)論 2 327
  • 正文 我和宋清朗相戀三年穿肄,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了年局。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片际看。...
    茶點(diǎn)故事閱讀 38,654評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡咸产,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出仲闽,到底是詐尸還是另有隱情脑溢,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站屑彻,受9級(jí)特大地震影響验庙,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜社牲,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評(píng)論 3 313
  • 文/蒙蒙 一粪薛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧搏恤,春花似錦违寿、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,762評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至息罗,卻和暖如春掂咒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背迈喉。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工绍刮, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人挨摸。 一個(gè)月前我還...
    沈念sama閱讀 46,382評(píng)論 2 360
  • 正文 我出身青樓录淡,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親油坝。 傳聞我的和親對(duì)象是個(gè)殘疾皇子嫉戚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評(píng)論 2 349