csrf認證機制:
django中對POST請求,csrf會進行認證處理,csrf認證機制是防御跨站偽造功能,在沒有任何處理的前提下,POST請求會報錯。
csrf認證中間件是在process_view執行(通過裝飾器強制認證或者放行可知),同時對類中的方法進行CSRF裝飾器操作需要:
【注意只能加在dispatch方法上(或者裝飾在類上指定dispatch方法),類中單獨方法無效】
csrf認證--模板操作:
模板文件中的操作:
django項目中默認對POST請求進行了csrf認證,只需要在模板提交數據的代碼塊中加入模板標簽{{% vsrf_token %}}即可,(不需要注銷seetings.py配置文件MIDDLEWARE列表中的'django.middleware.csrf.CsrfViewMiddleware',),模板頁面在渲染時會自動在相應位置渲染成隱藏的input標簽:<input type="hidden" name="csrfmiddlewaretoken" value="8J4z1wiUEXt0gJSN59dLMnktrXFW0hv7m4d40Mtl37D7vJZfrxLir9L3jSTDjtG8">每次都是隨機的
csrf認證--模塊操作:
在views.py中首先導入模塊:from django.views.decorators.csrf import csrf_exempt,csrf_protect
(1)放行認證:@csrf_exempt
1 @csrf_exempt #放行csrf認證(即使settings.py中存在全局認證機制,也對此次POST請求的視圖函數放行) 2 def login(request): 3 if request.method=="GET": 4 return render(request,"login.html") 5 elif request.method=="POST": 6 name=request.POST.get("username") 7 psd=request.POST.get("userpsd") 8 status=models.auth(name,psd) 9 if status: 10 return HttpResponse("<h1>Success!</h1>") 11 else: 12 return render(request,"login_fail.html")
(2)強制認證:@csrf_protect
1 @csrf_protect #強制csrf認證(即使settings.py中不存在全局認證機制,也對此次POST請求的視圖函數強制認證) 2 def login(request): 3 if request.method=="GET": 4 return render(request,"login.html") 5 elif request.method=="POST": 6 name=request.POST.get("username") 7 psd=request.POST.get("userpsd") 8 status=models.auth(name,psd) 9 if status: 10 return HttpResponse("<h1>Success!</h1>") 11 else: 12 return render(request,"login_fail.html")
login.html
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <meta http-equiv="refresh" content=""> 6 <meta name="keywords" content=""> 7 <style></style> 8 <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script> 9 <link rel="stylesheet" href=""> 10 <title>login</title> 11 </head> 12 <body> 13 <form action="http://127.0.0.1:8888/login/" method="post"> 14 {# {% csrf_token %}<!--在進行模板渲染時會自動生成一個隱藏的input標簽(csrf認證標識)-->#} 15 <table> 16 <tr> 17 <td>用戶名:</td> 18 <td><input type="text" name="username"></td> 19 </tr> 20 <tr> 21 <td>密碼:</td> 22 <td><input type="text" name="userpsd"></td> 23 </tr> 24 <tr> 25 <td><input type="reset"></td> 26 <td><input type="submit" ></td> 27 </tr> 28 </table> 29 </form> 30 </body> 31 </html> 32