1. 程式人生 > >Django---類檢視詳解

Django---類檢視詳解

類檢視的引入

以函式的形式進行定義的檢視就是函式檢視,檢視函式便於理解,但是遇到一個檢視函式對應的路徑提供了多種不同的HTTP請求方式的支援時(get,post,delete,put),需要在一個函式中寫不同的業務邏輯,程式碼的可讀性和複用性就很底, 所以,我們引入類檢視進行解決.

 def register(request):
    """處理註冊"""

    # 獲取請求方法,判斷是GET/POST請求
    if request.method == 'GET':
        # 處理GET請求,返回註冊頁面
        return render(request, 'register.html'
) else: # 處理POST請求,實現註冊邏輯 return HttpResponse('這裡實現註冊邏輯')

使用類檢視講不通的請求方式進行不同的方式進行區分定義:

class DefineClassview(View):
"""演示類檢視的定義和使用"""
def get(self, request):
"""處理GET請求業務邏輯"""
return HttpResponse('GET請求業務邏輯')

    def post(self, request):
"""處理POST請求業務邏輯"""
return HttpResponse('POST請求業務邏輯'
) def put(self, request): pass

類檢視的優點:

  • 程式碼可讀性好
  • 類檢視相對於函式檢視有更高的複用性,如果其他地方需要使用到某個類的某個特定方法,直接繼承該類的檢視就可以了

類檢視的使用

定義類檢視需要繼承自的Django提供的父類的View

匯入方法:  

from django.views.generic import View    
或 : from django.views.generic.base import View
配置路由時,需要使用類檢視的as_view()方法來註冊新增
urlpatterns = [
    # 檢視函式:註冊
    # url(r'^register/$', views.register, name='register'),
# 類檢視:註冊 as_view()可以將類檢視轉換成檢視,並決定如何分發請求 url(r'^register/$', views.RegisterView.as_view(), name='register'), ]

類檢視使用裝飾器

 定義一個為函式檢視準備的裝飾器,和一個要被裝飾的類檢視

def my_decorator(view_func):
"""
    定義裝飾器,裝飾類檢視
:param view_func: 被裝飾的檢視函式
:return: wrapper,裝飾的結果
    """
def wrapper(request, *args, **kwargs):
print('裝飾器被呼叫了')
        print(request.method, request.path)

        # 呼叫給裝飾的檢視函式
return view_func(request, *args, **kwargs)
    return wrapper
class DefineClassview(View):
"""演示類檢視的定義和使用"""
def get(self, request):
"""處理GET請求業務邏輯"""
return HttpResponse('GET請求業務邏輯')

    def post(self, request):
"""處理POST請求業務邏輯"""
return HttpResponse('POST請求業務邏輯')

    def put(self, request):
        pass
url(r'^define_classview/$',my_decorator(views.DefineClassview.as_view())),   #這種方法可以給類檢視的所有方法新增裝飾器功能
@method_decorator(my_decorator, name='dispatch')  # 直接在類檢視上面新增裝飾器 同樣可以實現給類檢視的所有方法新增裝飾器功能
url(r'^define_classview/$', views.DefineClassview.as_view()),

method_decorator裝飾器使用name引數指明被裝飾的方法

為特定的請求方法新增裝飾器:

如果需要為類檢視的多個方法新增裝飾器,但又不是所有的方法(為所有方法新增裝飾器參考上面例子),可以直接在需要新增裝飾器的方法上使用method_decorator,如下所示

# 在不同的檢視函式上新增裝飾器,有的不需要
class DefailView(View):
@method_decorator(my_decorator,name='get')
    def get(self,request):
print('get方法')
        return HttpResponse('get請求方法')

    @method_decorator(my_decorator,name='post')
    def post(self,request):
print('post方法')
        return HttpResponse('post方法')

    def put(self,request):
        pass

類檢視Mixin擴充套件類

使用面向物件多繼承的特性,可以通過定義父類(作為擴充套件類),在父類中定義想要向類檢視補充的方法,類檢視繼承這些擴充套件父類,便可實現程式碼複用。

定義的擴充套件父類名稱通常以Mixin結尾。

# 多繼承  擴充套件Mixin
class ListModelMixin(object):
    def list(self,request,*args,**kwargs):
print('list檢視函式被呼叫了')
        return HttpResponse('list檢視函式')

class CreateModelMixin(object):
    def create(self,request,*args,**kwargs):
print('create檢視被呼叫了')
        return HttpResponse('create檢視')

class BookView(CreateModelMixin,ListModelMixin,View):
    def get(self,request):
self.list(request)
        print('子類的get方法')
        return HttpResponse('get方法')

    def post(self,request):
self.create(request)
        print('子類的post方法')
        return HttpResponse('post方法')

class SaveOrderView(CreateModelMixin,View):
    def get(self,request):
self.create(request)
        return HttpResponse('Save類')