中間件

中間件

若是涉及到全局的功能 就應該考慮使用中間件html

關於中間件 django.middleware.csrf.CsrfViewMiddleware

這個中間件是解決跨站僞類請求而設置的
在前端隨機生成一個設置好的隨機字符串,提交到咱們的數據提交接口的時候就校驗,有就提交,沒有就403前端

跨扎僞類請求

跨扎僞類請求,其實就是一個釣魚網站python

原理

  1. 搭建一個和轉帳網站如出一轍的網站
  2. form表單中action提交的地址提交到正規網站同樣的地址
  3. 設置一個暴露給用戶的收款人的提交框
  4. 提早隱藏一個收款人的提交框,默認是本身的帳戶,就是有name和value的input框
  5. 用戶一旦輸入,只有用戶名和密碼是有效的,收款人是無效的,默認的收款人是咱們本身,可是提交的接口是有效的,因此轉帳轉到咱們帳戶

如何經過CsrfViewMiddleWare中間件

form表單提交

只須要在寫前端form表單的時候加上一個
{% csrf_token %}程序員

ajax如何校驗

第一種:

先寫上 {% csrf_token %} ,在經過標籤查找,放在data中傳過去ajax

$.ajax({
    url:'',
    type:'post',
    data:{'name':'xc', 'csrfmiddlewaretoken': $('[name=csrfmiddlewaretoken]').val()}
})

第二種:

直接使用 {{ scrf_token }}放在data中傳過去django

$.ajax({
    url:'',
    type:'post',
    data:{'name':'xc', 'csrfmiddlewaretoken': {{ csrf_token }}}
})

第三種:

使用官方文檔寫好的js文件,導入一下到html頁面就能夠了,就相似於JQuery文件的導入cookie

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;
}
var csrftoken = getCookie('csrftoken');



function csrfSafeMethod(method) {
  // these HTTP methods do not require CSRF protection
  return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}

$.ajaxSetup({
  beforeSend: function (xhr, settings) {
    if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
      xhr.setRequestHeader("X-CSRFToken", csrftoken);
    }
  }
});

django中間件暴露給程序員五個能夠自定義的方法

五個方法都是在特定的條件下自動觸發的session

建立自定義中間件步驟

第一步:app

新建一個文件夾 裏面新建一個任意名稱的py文件
裏面寫類 固定繼承函數

from django.utils.deprecation import MiddlewareMixin

class MyMiddle(MiddlewareMixin): # 中間件
    ...

第二步:

去配置文件註冊到中間件配置中

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',
    # 在這裏加
    'app01.文件夾名.py文件名.MyMiddle'
]

能夠自定義的五個方法

須要掌握:

process_request:

請求來的時候 會從上往下依次通過每個中間件裏面process_request,一旦裏面返回了HttpResponse對象那麼就再也不日後執行了 會執行同一級別的process_response

def process_request(self,request):
    print('我是第一個自定義中間件裏面的process_request方法')
    return HttpResponse("我是第一個自定義中間件裏面的HttpResponse對象返回值")  # 直接原地返回

process_response

響應走的時候 會從下往上依次進過每個中間件裏面的process_response

def process_response(self,request,response):  # response就是要返回給用戶的數據
    print("我是第一個自定義中間件裏面的process_response方法")
                            return response

瞭解:

  • process_view:路由匹配成功以後執行視圖函數以前觸發
  • process_exception:當視圖函數出現異常(bug)的時候自動觸發
  • process_template_response:當視圖函數執行完畢以後而且返回的對象中含有render方法的狀況下才會觸發

全局csrf校驗和全局不校驗以及裝飾器裝飾CBV

全局csrf校驗的裝飾器

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

csrf_exempt: 這個裝飾器是忽略,也就是csrf不驗證裝飾了這個裝飾器的視圖函數.
csrf_protect: 這個裝飾器是保護,也就是若是沒有設置csrf中間件,裝飾了這個裝飾器的視圖函數是要驗證的.

裝飾CBV

from django.utils.decorators import method_decorator

相關文章
相關標籤/搜索