全國(guó)咨詢(xún)/投訴熱線:400-618-4000

首頁(yè)技術(shù)文章正文

類(lèi)視圖及定義視圖的方法

更新時(shí)間:2022-07-26 來(lái)源:黑馬程序員 瀏覽量:

  雖然一個(gè)視圖處理用戶(hù)的一個(gè)請(qǐng)求,但HTTP提供了多種請(qǐng)求方式(GET、POST、PUT等),用戶(hù)使用應(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ì)了類(lèi)視圖。

  類(lèi)視圖允許在views.py的一個(gè)類(lèi)中定義不同的方法,以處理同一功能以不同請(qǐng)求方式發(fā)送的請(qǐng)求。

  假設(shè)有來(lái)自同一URL的GET請(qǐng)求和POST請(qǐng)求,以函數(shù)視圖和類(lèi)視圖的形式分別組織代碼,具體示例如下:

      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.以類(lèi)的形式定義視圖

# 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ù)而非定義了方法的類(lèi),所以URL配置中會(huì)調(diào)用視圖類(lèi)的as_view()方法。as_view()方法的功能是接收請(qǐng)求,獲取請(qǐng)求方法request.method,并根據(jù)request.method返回相應(yīng)的視圖方法。

  在urls.py中配置URL,調(diào)用以上定義的類(lèi)視圖,示例代碼如下:

# 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類(lèi)的as_view()方法,根據(jù)不同的請(qǐng)求方式執(zhí)行類(lèi)視圖MyView中的不同請(qǐng)求方法。

分享到:
在線咨詢(xún) 我要報(bào)名
和我們?cè)诰€交談!