Django的中間件

Django的中間件

什麼是中間件

中間件是一個用來處理Django的請求和響應的框架級別的鉤子。它 是一個輕量、低級別的插件系統,用於在全局範圍內改變Django的輸入和輸出。html

Django默認使用的中間件

在Django項目的setting.py文件中前端

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

中間件是按照配置文件中的順序來執行地python

自定義中間件

在項目的任意位置新建一個文件夾,文件夾中新建任意一個.py文件,在文件中添加以下內容:ajax

from django.utils.deprecation import MiddlewareMixin

class MyMiddle(MiddlewareMixin):
    ...

上面就是一個沒有任何方法的中間件,若是想要讓Django運行你定義的中間件,那麼就須要在你的setting.py文件中配置中間件django

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'middlewareMixin.log_auth.MyMiddle',    # : 就是這個
]

Django爲用戶提供了五個中間件的方法,經常使用的只有兩個:後端

  • process_request(self, request)瀏覽器

    當請求來時,會觸發這個方法,在將request傳給視圖函數以前能夠對request進行一系列操做服務器

    def process_request(self, request):
        print("請求來時會走這個")

    若是咱們在這個方法裏面返回了HttpResponse對象,那麼便會觸發當前對象中的process_response方法,並原路返回給瀏覽器cookie

    def process_request(self, request):
        return HttpResponse("你的請求不符合個人要求,拒絕訪問!")
  • process_response(self, request, response)session

    上面咱們講到會觸發同級的process_response方法,這個方法必須將response返回,而且必須是按照這個位置寫,由於調用這個方法的傳參方式是按照位置傳參,第二個就是response對象

    def process_response(self, request, response):
        print("響應時會走這個")
        return response
  • process_view

    當咱們的路由匹配成功以後,在視圖函數執行以前

  • process_exception

    當視圖函數出現異常時自動觸發

  • process_template_response

    當視圖函數執行完畢,返回的HttpResponse對象中包含render方法時纔會觸發

csrf:跨站請求僞造

跨站請求僞造就是至關於釣魚網站。模仿一個正常的網站來盜取得你用戶名密碼之類的。

解決跨站請求僞造的策略

只要是用戶想要提交post請求的頁面 我在返回給用戶的時候就提早設置好一個隨機字符串

  • 當用戶提交post請求的時候 我會自動先取查找是否有該隨機字符串
  • 若是有 正常提交
  • 若是沒有 直接報403

在Django中已經爲咱們寫好了一個解決跨站請求僞造的中間件,咱們只須要會使用就能夠了

使用Django自帶的csrf

提交方式
  • form表單提交

    咱們只須要在form表單中添加 {% csrf_token %} 通過後端頁面渲染就會變成一個隱藏的input框,框內的值就是服務器生成的隨機字符串

  • ajax提交

    • 第一種:在頁面上隨便一個地方添加 {% csrf_token %} 經過獲取值

    • 第二種:直接在ajax的data數據中添加一組鍵值對:'csrfmiddlewaretoken':'{{ csrf_token }}'

    • 第三種:經過js來獲取csrf

      function getCookie(name) {
          var cookieValue = null;
          if (document.cookie && document.cookie !== '') {
              var cookies = document.cookie.split(';');
              for (var i = 0; i < cookies.length; i++) {
                  var cookie = jQuery.trim(cookies[i]);
                  // Does this cookie string begin with the name we want?
                  if (cookie.substring(0, name.length + 1) === (name + '=')) {
                      cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                      break;
                  }
              }
          }
          return cookieValue;
      }
      
      
      $.ajax({
          url: "",
          type: "post",
          headers: {"X-CSRFToken": getCookie('csrftoken')},
          success: function (res) {
              alert(res);
          }
      })

咱們除了能夠在前端頁面上設置csrf以外還能夠在後端設置本次請求不校驗

  • FBV

    from django.views.decorators.csrf import csrf_exempt
    
    @csrf_exempt   # 只要加裝了這個裝飾糖那麼就不會對這個接口進行csrf檢測
    def test_csrf(request):
    
        if request.method == "POST":
            return HttpResponse("成功接收請求!")
    
        return render(request, "test.html")
  • CBV

    from django.views.decorators.csrf import csrf_exempt
    from django.utils.decorators import method_decorator
    # 第一種
    # @method_decorator(csrf_exempt,name='dispatch')   # 將裝飾器加裝在類上面指定dispatch方法
    class MyCsrf(View):
        # 第二種   # 將裝飾器加裝在dispatch方法上面
        @method_decorator(csrf_exempt)
        def dispatch(self, request, *args, **kwargs):
            return super().dispatch(request, *args, **kwargs)
        def get(self, request):
            return HttpResponse('hahaha')
        def post(self, request):
            return HttpResponse("成功接收請求!")
相關文章
相關標籤/搜索