中間件是一個用來處理Django的請求和響應的框架級別的鉤子。它 是一個輕量、低級別的插件系統,用於在全局範圍內改變Django的輸入和輸出。html
在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方法時纔會觸發
跨站請求僞造就是至關於釣魚網站。模仿一個正常的網站來盜取得你用戶名密碼之類的。
只要是用戶想要提交post請求的頁面 我在返回給用戶的時候就提早設置好一個隨機字符串
在Django中已經爲咱們寫好了一個解決跨站請求僞造的中間件,咱們只須要會使用就能夠了
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("成功接收請求!")