在Django中就是一個類,在全局範圍內改變Django的輸入和輸出。django
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對象
csrf中間件對象
csrf 跨站請求僞造blog
補充兩個裝飾器: from django.views.decorators.csrf import csrf_exempt,csrf_protect csrf_exempt 給視圖加上裝飾器後,當前的視圖不須要CSRF校驗 csrf_protect 給視圖加上裝飾器後,當前的視圖須要CSRF校驗
process_request:
從cookie中獲取csrftoken的值 —— 》 request.META['CSRF_COOKIE']繼承
csrf_token = request.META.get('CSRF_COOKIE') # cookie中獲取csrftoken的值
# 獲取提交的csrfmiddlewaretoken的值
request_csrf_token = request.POST.get('csrfmiddlewaretoken', '')
若是或許不到csrfmiddlewaretoken的值
再嘗試從請求頭中獲取X_CSRFTOKEN的值 —— 》request_csrf_token
定義中間件