1. 程式人生 > >裝飾器 以及 django 中的應用

裝飾器 以及 django 中的應用

  • 裝飾器本質上是一個Python函式,它可以讓其他函式在不需要做任何程式碼變動的前提下增加額外功能,裝飾器的返回值也是一個函式物件。它經常用於有切面需求的場景,比如:插入日誌、效能測試、事務處理、快取、許可權校驗等場景。裝飾器是解決這類問題的絕佳設計,有了裝飾器,我們就可以抽離出大量與函式功能本身無關的雷同程式碼並繼續重用。
    # 簡單的 裝飾器
    from functools import wraps # 裝飾器修復

    def wrapper(func):
      @wraps(func)  # 裝飾器修復
        def inner(*args, **kwargs):
            # 執行函式前的操作
            ret = func(*args, **kwargs)
            # 執行函式後的操作
            return ret
        return inner
    
    
    @wrapper  # 加裝飾器
    def func():
        print("Hello Word!")
    
    
    # 有開關的 裝飾器
    flag = True    #  通過 T 或 F  判斷是否使用裝飾器
    
    def outher(flag):
        def wrapper(func):
          @wraps(func)  # 裝飾器修復
            def inner(*args, **kwargs):
              if flag:
                  return func(*args, **kwargs)
                 # 執行函式前的操作
              ret = func(*args, **kwargs)
              # 執行函式後的操作
              return ret
            return inner
        return wrapper
    
    @outher(flag)
    def func():
        print("Hello Word!")
  • 給CBV 加裝飾器 --->>> 給 類 及 方法 加裝飾器
    from django.views import View
    from django.utils.decorators import method_decorator
    import time

    # 計算執行時間
    def timer(func):
        def inner(request, *args, **kwargs):
            start = time.time()
            ret = func(request, *args, **kwargs)
            end = time.time()
            print('時間:{}'.format(end - start))
            return ret
        return inner
    
    給類加裝飾器 要 制定 name='方法名' 
    # @method_decorator(timer, name='post')
    # @method_decorator(timer, name='get')
    class AddPublisher(View):
        # http_method_names = ['get']
    
        @method_decorator(timer)
        def get(self, request):
            return render(request, '***.html')
    
        @method_decorator(timer)
        def post(self, request):
    
            return self.get(request)
  • Django 中自帶的裝飾器
    from django.views.decorators.csrf import csrf_exempt, csrf_protect

    csrf_exempt
    給檢視加上裝飾器後,當前的檢視不需要CSRF校驗
    
    csrf_protect
    給檢視加上裝飾器後,當前的檢視需要CSRF校驗
    
    
    確保瀏覽器帶有cookie的兩種方式:
        > 在form表單內加入 {% csrf_token %}
        > 不使用{% csrf_token %},匯入
        from django.views.decorators.csrf import ensure_csrf_cookie
        將
        ensure_csrf_cookie
        以裝飾器形式加在檢視上,保證返回的相應有cookie