1. 程式人生 > >Django:(05)類檢視,裝飾器和中介軟體

Django:(05)類檢視,裝飾器和中介軟體

一、類檢視的定義和使用

在Django中還可以通過類來定義一個檢視,稱為類檢視

定義一個類檢視:定義一個類,需繼承 Django 提供的 View 類 。

from django.views.generic import View

 class TestView(View):

     def get(self, request):
         """get請求"""
         return render(request, 'index.html')

     def post(self, request):
         """post請求"""
         # 程式碼略
         return HttpResponse('操作結果')

路由配置:呼叫類檢視的 as_view() 方法

 urlpatterns = [
     ...
     url(r'^Test$', views.PostView.as_view()),
 ]

as_view()的作用是按照不同請求方式呼叫不同請求方法,詳情檢視 as_view() 方法原始碼,以及其內部呼叫的 dispatch()

二、類檢視繼承擴充套件類

定義的擴充套件父類名稱通常以Mixin結尾,類檢視可以直接通過多繼承,繼承他們的方法。

  • ListModelMixin 查詢多條資料(列表資料)

  • CreateModelMixin 新增一條資料

  • RetrieveModelMixin 查詢一條資料

  • UpdateModelMixin 修改一條資料

  • DestroyModelMixin 刪改一條資料

這些 Mixin 類分別提供了不同的類檢視方法{{TODO:後續補充詳情}})

class DepartmentView(CreateModelMixin, ListModelMixin, View):
    """
    同時繼承兩個擴充套件類
    """
    def get(self, request):
        # 複用父類ListModelMixin的list方法
        return self.list(request)    

    def post(self, request):
        # 複用父類CreateModelMixin的create方法
        return self.create(request) 

class EmployeeView(CreateModelMixin, View):
    """
    繼承CreateModelMixin擴充套件類
    """
    def post(self, request):
        # 複用父類ListModelMixin的list方法
        return self.create(request)

三、為檢視新增裝飾器

裝飾器:不在改變原有函式的前提下,在函式呼叫之前或之後執行額外的操作

1、準備一個裝飾器

def check_ip(view_fun):
     """裝飾器:禁止黑名單ip訪問"""
     def wrapper(request, *args, **kwargs):
         # 在檢視函式執行前做額外的操作:
         # 禁止ip黑名單訪問
         IP = request.META.get('REMOTE_ADDR')
         if IP in ['192.168.210.160']:
             return HttpResponse('IP禁止訪問')
         return view_fun(request, *args, **kwargs)
     return wrapper

2、不能直接使用我們上面的裝飾器(缺少self引數)

需要使用method_decorator 裝飾器,函式裝飾器補充第一個self引數,使它可以應用到類的方法中。

@method_decorator(check_ip)

3、給類檢視的特定的方法新增裝飾器

class PostView(View):

    @method_decorator(check_ip)
    def post(self, request):
        return HttpResponse('處理髮帖操作')

4、給類檢視的所有方法應用裝飾器:

給 dispatch 方法加上@method_decorator(check_ip),就能給給類檢視的所有方法應用裝飾器:

class PostView(View):

    @method_decorator(check_ip)
    def dispatch(self, request, *args, **kwargs):
        return super().dispatch(request, *args, **kwargs)

5、另一種方式:

在類上面新增裝飾器,指定對哪個方法進行裝飾 :@method_decorator(裝飾器名, name='檢視方法名')

@method_decorator(check_ip, name='get')
class PostView(View):

    def get(self, request):
        return render(request, 'index.html')

    def post(self, request):
        return HttpResponse('操作結果')

四、Django中介軟體

一個輕量級、底層的外掛系統,用於在檢視函式呼叫之前或之後執行額外操作,在全域性上修改Django的輸入或輸出。

方法名 作用 返回值
__init__(self, get_response=None) 伺服器啟動(重啟)時執行一次
process_request(self, request) 在檢視執行之前呼叫 返回 None: 會執行檢視;返回 HttpResponse: 不會再執行檢視
process_response(self, request, response) 在檢視執行完之後呼叫 必須返回HttpResponse物件

image

1、定義中介軟體

通過繼承Django的MiddlewareMixin擴充套件類實現

class MyMiddleware(MiddlewareMixin):
    def process_request(self, request):
        print('before 檢視')

    def process_response(self, request, response):
        print('after 檢視')
        return response     # 必須要有返回值

process_request():可以返回None或者response物件,如果返回response物件,則檢視函式就不會再執行了

2、在settings檔案中配置

MIDDLEWARE = [
     'middlewares.MyMiddleware',  # 註冊中介軟體
 ]

3、多箇中間件的執行順序

  • 對於檢視之前執行的 process_request 方法,先 註冊的中介軟體先執行
  • 對於檢視之後執行的 process_response 方法,後 註冊的中介軟體先執行

要注意多箇中間件之間的依賴關係, 被依賴的中介軟體要宣告在前面