Django 中間件

在Django中就是一個類,在全局範圍內改變Django的輸入和輸出。django

  1. 五個方法
  • process_request(self,request)
  • process_view(self, request, view_func, view_args, view_kwargs)
  • process_template_response(self,request,response)
  • process_exception(self, request, exception)
  • process_response(self, request, response)
    參數 執行的時間 執行的順序 返回值cookie

    process_request(self,request)app

    執行時間:在視圖函數執行以前
    
      參數:request   ——》  跟視圖函數中的是同一個
    
      執行順序:按照註冊順序  順序執行
    
      返回值:None: 正常流程
    
              HttpResponse對象:不執行後面中間中的process_request方法,不執行視圖函數,直接執行當前中間件中的process_response方法,後面正常走

    process_response(self, request, response)函數

    執行時間:在視圖函數執行以後
    
      參數:request   ——》  跟視圖函數中的是同一個
    
              response   ——》  視圖函數中傳遞的響應對象
    
      執行順序:按照註冊順序  倒敘執行
    
      返回值:HttpResponse對象:必須是響應對象

    process_view(self, request, view_func, view_args, view_kwargs)code

    執行時間:在process_request方法以後,在視圖函數執行以前
    
      參數:request   ——》  跟視圖函數中的是同一個
    
             view_func ——》 視圖函數
    
             view_args —— 》視圖函數的位置參數
    
             view_kwargs——》視圖函數的關鍵字參數
    
      執行順序:按照註冊順序  順序執行
    
      返回值:None: 正常流程
    
              HttpResponse對象:不執行後面中間中的process_view方法,不執行視圖函數,直接執行最後一箇中間件中的process_response方法,後面正常走

    process_exception(self, request, exception)csrf

    執行時間:出現異常的時候才執行
    
      參數:request   ——》  跟視圖函數中的是同一個
    
             exception——》  異常對象
    
      執行順序:按照註冊順序  倒敘執行
    
      返回值:None: 正常流程
    
          HttpResponse對象:不執行後面中間中的process_exception方法,直接執行最後一箇中間件中的process_response方法,後面正常走

    process_template_response(self,request,response)中間件

    執行時間:視圖函數返回的response對象有一個叫render的方法
    
      參數:request   ——》  跟視圖函數中的是同一個
    
             response   ——》  視圖函數中傳遞的響應對象
    
      執行順序:按照註冊順序  倒敘執行
    
      返回值:必須返回response對象

img
img
img

csrf中間件對象

csrf 跨站請求僞造blog

補充兩個裝飾器:

from django.views.decorators.csrf import csrf_exempt,csrf_protect

csrf_exempt   給視圖加上裝飾器後,當前的視圖不須要CSRF校驗

csrf_protect    給視圖加上裝飾器後,當前的視圖須要CSRF校驗
  1. process_request:
    從cookie中獲取csrftoken的值 —— 》 request.META['CSRF_COOKIE']繼承

  2. process_view
    1. 視圖函數加上csrf_exempt裝飾器,不進行CSRF校驗
    2. 請求方式 是'GET', 'HEAD', 'OPTIONS', 'TRACE' 也不進行校驗
    3. csrf_token = request.META.get('CSRF_COOKIE') # cookie中獲取csrftoken的值
      # 獲取提交的csrfmiddlewaretoken的值
      request_csrf_token = request.POST.get('csrfmiddlewaretoken', '')
      若是或許不到csrfmiddlewaretoken的值
      再嘗試從請求頭中獲取X_CSRFTOKEN的值 —— 》request_csrf_token

    4. request_csrf_token 和 csrf_token 進行比較
      1. 能比較成功 經過校驗
      2. 不能比較成功 拒絕

定義中間件

  1. 在APP 下建立 middleware 的文件夾
  2. 寫一個 py 文件
  3. 定義一個類 繼承middlewareMixin 類
    from django.utils.deprecation import MiddlewareMixin
  4. 註冊中間件 app名.middleware.***.py.類名
相關文章
相關標籤/搜索