更新時(shí)間:2022-07-26 來(lái)源:黑馬程序員 瀏覽量:
雖然一個(gè)視圖處理用戶的一個(gè)請(qǐng)求,但HTTP提供了多種請(qǐng)求方式(GET、POST、PUT等),用戶使用應(yīng)用的某個(gè)功能時(shí),該功能可能以任意一種方式發(fā)起請(qǐng)求,例如商品管理功能使用GET方式發(fā)起的呈現(xiàn)商品列表的請(qǐng)求、使用POST方式發(fā)起的修改商品請(qǐng)求等。此時(shí)視圖需要結(jié)合條件分支,對(duì)每種請(qǐng)求方式分別進(jìn)行處理。然而,若所有請(qǐng)求方式的處理邏輯都定義在同一個(gè)視圖中,視圖很可能龐大且臃腫。為了解決這一問(wèn)題,Django設(shè)計(jì)了類視圖。
類視圖允許在views.py的一個(gè)類中定義不同的方法,以處理同一功能以不同請(qǐng)求方式發(fā)送的請(qǐng)求。
假設(shè)有來(lái)自同一URL的GET請(qǐng)求和POST請(qǐng)求,以函數(shù)視圖和類視圖的形式分別組織代碼,具體示例如下:
1.以函數(shù)的形式定義視圖
from django.http import HttpResponse def my_view(request): if request.method == 'Get': return HttpResponse('Get result') elif request.method == 'POST': return HttpResponse('POST result')
2.以類的形式定義視圖
# views.py from django.http import HttpResponse form django.views import View class MyView(View): def get(self, request): return HttpResponse('Get result') def post(self,request): return HttpResponse('POST result')
Django的URLconf期望將和請(qǐng)求關(guān)聯(lián)的參數(shù)直接傳遞給可調(diào)用的函數(shù)而非定義了方法的類,所以URL配置中會(huì)調(diào)用視圖類的as_view()方法。as_view()方法的功能是接收請(qǐng)求,獲取請(qǐng)求方法request.method,并根據(jù)request.method返回相應(yīng)的視圖方法。
在urls.py中配置URL,調(diào)用以上定義的類視圖,示例代碼如下:
# urls.py from django.urls import path from views import MyView urlpatterns = [ path('about/', MyView.as_view()), ]
以上示例中的path()函數(shù)在接收到URL“about/”時(shí),會(huì)調(diào)用MyView類的as_view()方法,根據(jù)不同的請(qǐng)求方式執(zhí)行類視圖MyView中的不同請(qǐng)求方法。