更新時間:2022-07-26 來源:黑馬程序員 瀏覽量:
雖然一個視圖處理用戶的一個請求,但HTTP提供了多種請求方式(GET、POST、PUT等),用戶使用應(yīng)用的某個功能時,該功能可能以任意一種方式發(fā)起請求,例如商品管理功能使用GET方式發(fā)起的呈現(xiàn)商品列表的請求、使用POST方式發(fā)起的修改商品請求等。此時視圖需要結(jié)合條件分支,對每種請求方式分別進行處理。然而,若所有請求方式的處理邏輯都定義在同一個視圖中,視圖很可能龐大且臃腫。為了解決這一問題,Django設(shè)計了類視圖。
類視圖允許在views.py的一個類中定義不同的方法,以處理同一功能以不同請求方式發(fā)送的請求。
假設(shè)有來自同一URL的GET請求和POST請求,以函數(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期望將和請求關(guān)聯(lián)的參數(shù)直接傳遞給可調(diào)用的函數(shù)而非定義了方法的類,所以URL配置中會調(diào)用視圖類的as_view()方法。as_view()方法的功能是接收請求,獲取請求方法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/”時,會調(diào)用MyView類的as_view()方法,根據(jù)不同的請求方式執(zhí)行類視圖MyView中的不同請求方法。