目錄html
中間件是介於request與response處理之間的一道處理過程,相對比較輕量級,而且在全局上改變django的輸入與輸出python
若是你想修改請求,例如被傳送到view中的HttpRequest對象。 或者你想修改view返回的HttpResponse對象,這些均可以經過中間件來實現。jquery
可能你還想在view執行以前作一些操做,這種狀況就能夠用 middleware來實現。ajax
Django默認的中間件:(在django項目的settings模塊中,有一個 MIDDLEWARE_CLASSES 變量,其中每個元素就是一箇中間件。每個中間件都有具體的功能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', ]
-process_request,從上往下執行 若是retrun HttpResponse的對象,直接返回了 若是retrun None ,繼續往下走 -process_response,從下往上執行 必需要retrun Httpresponse的對象
from django.utils.deprecation import MiddlewareMixin
在app01中建立一個py文件——mymiddelware服務器
class Md1(MiddlewareMixin): def process_request(self,request): print("Md1請求") # 返回None的時候,繼續往下走 # 返回HttpRspons對象,直接返回,走本身的process_response def process_response(self,request,response): print("Md1返回") return response class Md2(MiddlewareMixin): def process_request(self,request): print("Md2請求") def process_response(self,request,response): print("Md2返回") return response
def index(request): print("view函數...") return HttpResponse("OK")
MIDDLEWARE = [ 'app01.mymiddelware.MyMiddleware1', 'app01.mymiddelware.MyMiddleware2', ]
結果爲cookie
Md1請求 Md2請求 view函數... Md2返回 Md1返回
請求來的時候,會走該方法session
def process_request(self,request):
響應回去的時候,會走該方法app
def process_response(self,request,response):
它應該返回None或一個HttpResponse對象。函數
若是返回None,Django將繼續處理這個請求,執行任何其餘中間件的process_view方法,而後在執行相應的視圖。
若是它返回一個HttpResponse對象,Django不會調用適當的視圖函數。 它將執行中間件的process_response方法並將應用到該HttpResponse並返回結果
def process_view(self, request, view_func, view_args, view_kwargs): # request是HttpRequest對象。 # view_func是Django即將使用的視圖函數。 (它是實際的函數對象,而不是函數的名稱做爲字符串。) # view_args是將傳遞給視圖的位置參數的列表. # view_kwargs是將傳遞給視圖的關鍵字參數的字典。 view_args和view_kwargs都不包含第一個視圖參數(request)。
這個方法只有在視圖函數中出現異常了才執行
該方法對視圖函數返回值有要求,必須是一個含有render方法類的對象,纔會執行此方法
攻擊者盜用了你的身份,以你的名義發送惡意請求,對服務器來講這個請求是徹底合法的
要完成一次CSRF攻擊,受害者必須依次完成兩個步驟:
1.登陸受信任網站A,並在本地生成Cookie。
2.在不登出A的狀況下,訪問危險網站B。
一、經過refer 二、加一個隨機字符串校驗(加載請求的路徑裏,加載請求體中) 三、在請求頭中加字符串校驗
<form action="" method="post"> {% csrf_token %} <p>用戶名:<input type="text" name="name"></p> <p>密碼:<input type="text" name="password"></p> <p><input type="submit"></p> </form>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <script src="/static/jquery-3.3.1.js"></script> <title>Title</title> </head> <body> <form action="" method="post"> {% csrf_token %} <p>用戶名:<input type="text" name="name"></p> <p>密碼:<input type="text" name="password" id="pwd"></p> <p><input type="submit"></p> </form> <button class="btn">點我</button> </body> <script> $(".btn").click(function () { $.ajax({ url: '', type: 'post', data: { 'name': $('[name="name"]').val(), 'password': $("#pwd").val(), // 'csrfmiddlewaretoken': $('[name="csrfmiddlewaretoken"]').val() }, success: function (data) { console.log(data) } }) }) </script> </html>
獲取cookie:document.cookie
是一個字符串,能夠本身用js切割,也能夠用jquery的插件
獲取cookie:$.cookie('csrftoken')
設置cookie:$.cookie('key','value')
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <script src="/static/jquery-3.3.1.js"></script> <script src="/static/jquery.cookie.js"></script> <title>Title</title> </head> <body> <form action="" method="post"> {% csrf_token %} <p>用戶名:<input type="text" name="name"></p> <p>密碼:<input type="text" name="password" id="pwd"></p> <p><input type="submit"></p> </form> <button class="btn">點我</button> </body> <script> $(".btn").click(function () { var token=$.cookie('csrftoken') //var token='{{ csrf_token }}' $.ajax({ url: '', headers:{'X-CSRFToken':token}, type: 'post', data: { 'name': $('[name="name"]').val(), 'password': $("#pwd").val(), }, success: function (data) { console.log(data) } }) }) </script> </html>
全站禁用:註釋掉settings中MIDDLEWARE的中間件 'django.middleware.csrf.CsrfViewMiddleware',
from django.views.decorators.csrf import csrf_exempt,csrf_protect # 再也不檢測,局部禁用(前提是全局使用) # @csrf_exempt @csrf_exempt def csrf_disable(request): print(request.POST) return HttpResponse('ok') # 檢測,局部使用(前提是全局禁用) # @csrf_protect def csrf_disable(request): print(request.POST) return HttpResponse('ok')
# CBV中使用 from django.views import View from django.views.decorators.csrf import csrf_exempt,csrf_protect from django.utils.decorators import method_decorator # CBV的csrf裝飾器,只能加載類上(指定方法爲dispatch)和dispatch方法上(django的bug) # 給get方法使用csrf_token檢測 @method_decorator(csrf_exempt,name='dispatch') class Foo(View): def get(self,request): pass def post(self,request): pass # @method_decorator(csrf_protect) def dispatch(self, request, *args, **kwargs): ret=super().dispatch(request, *args, **kwargs) return ret