Django項目報錯: 禁止訪問(403),CSRF驗證失敗,相應中斷

若是想要取消表單的CSRF防禦,能夠在模板上刪除{% csrf_token %}, 而且在相應的視圖函數中添加裝飾器@csrf_exempt, 代碼以下:javascript

 

from django.views.decorators.csrf import csrf_exempthtml

@csrf_exempt前端

def registerView(request):java

  passajax

  return render(request,'user.html',locals())django

 

若是隻是在模板上刪除{% csrf_token %},並無在相應的視圖函數中設置過濾器@csrf_exempt,那麼當用戶提交表單時,程序因CSRF驗證失敗而拋出403異常的頁面,以下圖:服務器

 

 最後還有一種狀況比較特殊,若是在配置文件setting.py 中刪除了中間件CsrfViewMiddleware,這樣是整個網站都取消了CSRF防禦。在全站沒有CSRF防禦的狀況下,又想對某些請求設置CERF防禦,那麼在模板上添加模板語法{% scrf_token %},而後在相應的視圖函數中添加裝飾器@csrf_protect便可實現 ,方法與上相似。
函數

 

值得注意的是,在平常開發中,若是某些網頁是使用前端的Ajax實現表單提交的,那麼Ajax向服務器發送POST請求時,請求參數必須添加csrf_token的信息,不然服務器會視該請求爲惡意請求。實現代碼以下:網站

 

<script> function submitForm(){ var csrf = $('input[name="csrfmiddlewaretoken"]').val(); var user = $('#user').val(); var password = $('#password').val(); $.ajax({ url : '/csrf1.html', type : 'POST', data : { "user":user, "password":password, "csrfmiddlewaretoken":csrf} success:function(arg){ console.log(arg); } }) } </script> 
相關文章
相關標籤/搜索