Django---類檢視詳解
阿新 • • 發佈:2019-01-25
類檢視的引入
以函式的形式進行定義的檢視就是函式檢視,檢視函式便於理解,但是遇到一個檢視函式對應的路徑提供了多種不同的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類')