12.33 Django框架簡介:
MVC,全名是Model View Controller,是軟件工程中的一種軟件架構(gòu)模式,把軟件系統(tǒng)分為三個(gè)基本部分:模型(Model)、視圖(View)和控制器(Controller),具有耦合性低、重用性高、生命周期成本低等優(yōu)點(diǎn)
Django框架的設(shè)計(jì)模式借鑒了MVC框架的思想,也是分成三部分,來降低各個(gè)部分之間的耦合性。
Django框架的不同之處在于它拆分的三部分為:Model(模型)、Template(模板)和View(視圖),也就是MTV框架。
Model(模型):負(fù)責(zé)業(yè)務(wù)對(duì)象與數(shù)據(jù)庫的對(duì)象(ORM)
Template(模版):負(fù)責(zé)如何把頁面展示給用戶
View(視圖):負(fù)責(zé)業(yè)務(wù)邏輯,并在適當(dāng)?shù)臅r(shí)候調(diào)用Model和Template
此外,Django還有一個(gè)urls分發(fā)器,它的作用是將一個(gè)個(gè)URL的頁面請(qǐng)求分發(fā)給不同的view處理,view再調(diào)用相應(yīng)的Model和Template
12.34 View(視圖)
一個(gè)視圖函數(shù)(類),簡稱視圖,是一個(gè)簡單的Python 函數(shù)(類),它接受Web請(qǐng)求并且返回Web響應(yīng)。
響應(yīng)可以是一張網(wǎng)頁的HTML內(nèi)容,一個(gè)重定向,一個(gè)404錯(cuò)誤,一個(gè)XML文檔,或者一張圖片。
12.341 CBV(class base view)
urls.py:
url(r
'
^add_class/$
'
, views.AddClass.as_view()),
CBV版添加班級(jí):
from
django.shortcuts
import
HttpResponse, render, redirect
from
django.views
import
View
from
app01
import
models
class
AddClass(View):
def
get(self, request):
return
render(request,
"
add_class.html
"
)
def
post(self, request):
class_name
= request.POST.get(
"
class_name
"
)
models.Classes.objects.create(name
=
class_name)
return
redirect(
"
/class_list/
"
)
12.342 視圖裝飾器
裝飾器裝飾FBV:
def
wrapper(func):
def
inner(*args, **
kwargs):
start_time
=
time.time()
ret
= func(*args, **
kwargs)
end_time
=
time.time()
print
(
"
used:
"
, end_time-
start_time)
return
ret
return
inner
?
#
FBV版添加班級(jí)
@wrapper
def
add_class(request):
if
request.method ==
"
POST
"
:
class_name
= request.POST.get(
"
class_name
"
)
models.Classes.objects.create(name
=
class_name)
return
redirect(
"
/class_list/
"
)
return
render(request,
"
add_class.html
"
)
裝飾器裝飾CBV:
類中的方法與獨(dú)立函數(shù)不完全相同,因此不能直接將函數(shù)裝飾器應(yīng)用于類中的方法 ,需要先將其轉(zhuǎn)換為方法裝飾器。
Django中提供了method_decorator裝飾器用于將函數(shù)裝飾器轉(zhuǎn)換為方法裝飾器
#
CBV版添加班級(jí)
from
django.views
import
View
from
django.utils.decorators
import
method_decorator
def
wrapper(func):
def
inner(*args, **
kwargs):
start_time
=
time.time()
ret
= func(*args, **
kwargs)
end_time
=
time.time()
print
(
"
used:
"
, end_time-
start_time)
return
ret
return
inner
?
#
@method_decorator(wrapper, name='post') 給post加方法裝飾器
#
@method_decorator(wrapper, name='dispatch') 給dispatch方法加裝飾器,相當(dāng)于給類下所有方法加裝飾器
class
AddClass(View):
#
http_method_names = ['get', ] #自定義可用的請(qǐng)求方法
?
@method_decorator(wrapper)
#
給get方法加裝飾器
def
get(self, request):
return
render(request,
"
add_class.html
"
)
?
def
post(self, request):
class_name
= request.POST.get(
"
class_name
"
)
models.Classes.objects.create(name
=
class_name)
return
redirect(
"
/class_list/
"
)
使用CBV時(shí)要注意:請(qǐng)求過來后會(huì)先執(zhí)行dispatch()這個(gè)方法,如果需要批量對(duì)具體的請(qǐng)求處理方法,如get,post等做一些操作的時(shí)候,這里我們可以手動(dòng)改寫dispatch方法,這個(gè)dispatch方法就和在FBV上加裝飾器的效果一樣。
class
Login(View):
def
dispatch(self, request, *args, **
kwargs):
print
(
'
before
'
)
obj
= super(Login,self).dispatch(request, *args, **
kwargs)
print
(
'
after
'
)
return
obj
def
get(self,request):
return
render(request,
'
login.html
'
)
def
post(self,request):
print
(request.POST.get(
'
user
'
))
return
HttpResponse(
'
Login.post
'
)
12.342 request對(duì)象
當(dāng)一個(gè)頁面被請(qǐng)求時(shí),Django就會(huì)創(chuàng)建一個(gè)包含本次請(qǐng)求原信息的HttpRequest對(duì)象,Django會(huì)將這個(gè)對(duì)象自動(dòng)傳遞給響應(yīng)的視圖函數(shù),一般視圖函數(shù)約定俗成地使用 request 參數(shù)承接這個(gè)對(duì)象
| path_info | 返回用戶訪問url的路徑,不包括域名和參數(shù):/music/bands/the_beatles/ | ? |
|---|---|---|
| method | 請(qǐng)求中使用的HTTP方法的字符串表示,全大寫表示:"GET"、"POST" | ? |
| GET | 包含所有HTTP GET參數(shù)的類字典對(duì)象 | ? |
| POST | 包含所有HTTP POST參數(shù)的類字典對(duì)象 | ? |
| body | 請(qǐng)求體,byte類型 request.POST的數(shù)據(jù)就是從body里面提取到的 | ? |
| get_full_path() | 返回URL中的路徑和參數(shù):/music/bands/the_beatles/?print=true | ? |
12.343 上傳文件示例
如果有上傳文件,html文件中的form表單一定要加 enctype="multipart/form-data"
upload_demo.html:
<
body
>
<
h1
>
Django 上傳文件示例
h1
>
<
form
action
="/upload/"
method
="post"
enctype
="multipart/form-data"
>
<
input
type
="text"
name
="username"
>
<
input
type
="file"
name
="touxiang"
>
<
input
type
="submit"
value
="提交"
>
form
>
body
>
如果有上傳文件,views.py中應(yīng)該從 request.FILES 中取上傳的文件對(duì)象
服務(wù)端接收文件:views.py
from
django.shortcuts
import
render, HttpResponse
from
django.http
import
JsonResponse
def
upload(request):
if
request.method ==
"
POST
"
:
#
print(request.POST) #只能拿到字典里的文件名
#
print(request.FILES) #拿到含有文件對(duì)象的字典
file_obj = request.FILES.get(
"
touxiang
"
)
#
得到文件對(duì)象
#
print(file_obj, type(file_obj))
file_name = file_obj.name
#
拿到文件名
with open(file_name,
"
wb
"
) as f:
for
line
in
file_obj.chunks():
#
從上傳的文件對(duì)象中一點(diǎn)一點(diǎn)讀取數(shù)據(jù)
f.write(line)
#
寫到新建的文件中
return
HttpResponse(
"
OK
"
)
return
render(request,
"
upload_demo.html
"
)
12.344 Response對(duì)象
每個(gè)視圖都需要實(shí)例化,填充和返回一個(gè)HttpResponse,本質(zhì)上render,redirect也是返回了HttpResponse對(duì)象
HttpResponse.content :響應(yīng)內(nèi)容 HttpResponse.charset :響應(yīng)內(nèi)容的編碼 HttpResponse.status_code :響應(yīng)的狀態(tài)碼
JsonResponse對(duì)象 :JsonResponse是HttpResponse的子類,Django封裝的一個(gè)專門用來返回JSON格式數(shù)據(jù)的方法
from
django.http.response
import
JsonResponse
def
get_json_data(request):
data
= {
"
name
"
:
"
Egon
"
,
"
hobby
"
:
"
喊麥
"
}
#
import json
#
return HttpResponse(json.dumps(data),content_type='application/json')
#
設(shè)置content_type,瀏覽器會(huì)自動(dòng)反序列化json
<-等同于->
#
ret = HttpResponse(json.dumps(data))
#
ret['Content-type'] = 'application/json'
#
return ret
return
JsonResponse(data)
?
#
return JsonResponse([1, 2, 3, 4], safe=False)
#
JsonResponse默認(rèn)只能傳遞字典類型,如果要傳遞非字典類型需要設(shè)置safe參數(shù)
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元

