Django學習 day70之Django第十六日

躍上青空發表於2020-10-25

一 django的session原理流程

在這裡插入圖片描述

二 自定義中介軟體

自定義步驟:

  1. 寫一個類,繼承MiddlewareMixin,匯入語法:from django.utils.deprecation import MiddlewareMixin
  2. 裡面寫方法process_request(請求來了,一定會觸發它的執行)
  3. 在setting中配置(注意順序,是放在前還是放在後)
	MIDDLEWARE = [
  		'app01.mymiddle.MyMiddleware1',
	]

三 process_request,process_response,process_view,process_exception

MiddlewareMixin物件的四大方法

  1. process_request(request物件)

  2. process_response(request物件,response物件)

  3. 多箇中介軟體,執行順序是什麼?
    請求來的時候從上往下執行:process_request
    請求走的時候,從下往上執行:process_response

  4. process_request可以幹什麼?

    1. 寫一箇中介軟體,不管前端用什麼編碼,在requset.data中都有post的資料
    2. 頻率限制(限制某個ip地址,一分鐘只能訪問5次)
    3. 登入認證(只要沒登入,重定向到login路徑)
    4. 記錄使用者訪問日誌(ip,時間,訪問路徑)
  5. process_response可以幹什麼?內部有response物件

    1. 統一給所有(某幾個路徑)加cookie
    2. 統一給所有(某幾個路徑)加響應頭
  6. process_view 路由匹配成功和檢視函式執行之前執行(callback就是檢視函式)
    在這裡插入圖片描述

    def process_view(self, request, callback, callback_args, callback_kwargs):
            # print(callback)
            # print(callback_args)
            # print(callback_kwargs)
            #
            res=callback(request)  # 使檢視函式提前到process_view之前執行
            #
            print("中介軟體1的process_view")
            return res
    
  7. process_exception 檢視函式出錯,會執行它(全域性異常捕獲)(記錄日誌,哪個ip地址,訪問哪個路徑,出的錯)

    # 全域性異常捕獲,返回4開頭的
    def process_exception(self, request, exception):
        print(exception)
        return render(request,'error.html')
    

四 CSRF_TOKEN跨站請求偽造

詳細資料點選這裡

  1. django解決csrf攻擊方法,利用中介軟體:django.middleware.csrf.CsrfViewMiddleware

  2. 後期中介軟體不能註釋,每次傳送post請求,都需要攜帶csrf_token隨機字串

    1. form表單提交
      在form表單中 {% csrf_token %}

    2. ajax提交(如何攜帶)

      1. 方式一:放到data中
        $.ajax({
               url: '/csrf_test/',
               method: 'post',
               data: {'name': $('[name="name"]').val(),
                   'password': $('[name="password"]').val(),
                   'csrfmiddlewaretoken':$('[name="csrfmiddlewaretoken"]').val()  /* 利用了元素查詢的方法 */
               },
               success: function (data) {
                   console.log('成功了')
                   console.log(data)
        
               },
               error: function (data) {
                   console.log('xxxxx')
                   console.log(data)
        
               }
           })
        
      2. 方式二:放到data中
        'csrfmiddlewaretoken':'{{ csrf_token }}'
      3. 方式三:放到頭中
        headers:{'X-CSRFToken':'{{csrf_token}}'},
  3. 全域性使用,區域性禁csrf
    在檢視函式上加裝飾器的方法

    from django.views.decorators.csrf import csrf_exempt,csrf_protect
    # 全域性啟用,區域性禁用(中介軟體不能註釋,這個檢視函式,已經沒有csrf校驗了)
    @csrf_exempt
    def csrf_test(request):
        if request.method=='GET':
            return render(request,'csrf_test.html')
        else:
            name=request.POST.get('name')
            password=request.POST.get('password')
            print(name)
            print(password)
            return HttpResponse('登入成功')
    
  4. 全域性禁用,區域性使用csrf(需要註釋掉csrf中介軟體)

    @csrf_protect
    def csrf_test(request):
        if request.method=='GET':
            return render(request,'csrf_test.html')
        else:
            name=request.POST.get('name')
            password=request.POST.get('password')
            print(name)
            print(password)
            return HttpResponse('登入成功')
    
  5. 古怪的使用方式,在urls.py中匯入裝飾器,並在路由中使用

    path('csrf_test/', csrf_exempt(views.csrf_test))

相關文章