若是涉及到全局的功能 就應該考慮使用中間件
html
這個中間件是解決跨站僞類請求而設置的
在前端隨機生成一個設置好的隨機字符串,提交到咱們的數據提交接口的時候就校驗,有就提交,沒有就403前端
跨扎僞類請求,其實就是一個釣魚網站python
只須要在寫前端form表單的時候加上一個
{% csrf_token %}
程序員
先寫上 {% 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); } } });
五個方法都是在特定的條件下自動觸發的
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,一旦裏面返回了HttpResponse對象那麼就再也不日後執行了 會執行同一級別的process_response
def process_request(self,request): print('我是第一個自定義中間件裏面的process_request方法') return HttpResponse("我是第一個自定義中間件裏面的HttpResponse對象返回值") # 直接原地返回
響應走的時候 會從下往上依次進過每個中間件裏面的process_response
def process_response(self,request,response): # response就是要返回給用戶的數據 print("我是第一個自定義中間件裏面的process_response方法") return response
瞭解:
from django.views.decorators.csrf import csrf_exempt, csrf_protect
csrf_exempt: 這個裝飾器是忽略,也就是csrf不驗證裝飾了這個裝飾器的視圖函數.
csrf_protect: 這個裝飾器是保護,也就是若是沒有設置csrf中間件,裝飾了這個裝飾器的視圖函數是要驗證的.
from django.utils.decorators import method_decorator