今天学习Django框架,用ajax向后台发送post请求,直接报了403错误,说CSRF验证失败;先前用模板的话都是在里面加一个 {% csrf_token %} 就直接搞定了CSRF的问题了;很显然,用ajax发送post请求这样就白搭了;
上网上查了一下,看了几个别人的博客,才知道官网也早有说明解决办法,大致流程就是:
就是新建一个JavaScript文件,然后把网上给的代码粘贴进去,然后在你使用ajax的页面把它引入一下;当然,如果你在网上找到的解决代码包含JQuery的话,那就需要在引入的JQuery之后引入了(毕竟解决代码不唯一,网上一找一堆,基本都是对的,原生JS和带JQuery的都有);
文末会附上我使用的JS相关代码,也可以去网上找!
如果上述没有解决你的问题,那就说明你和我踩了同样的一个小坑........
用了上面查到的方法,直接就解决了我的问题,但是随着我对代码修修改改、清除了相关页面的cookie,吃个饭再运行,竟然又报403的CSRF错误了;百思不得其解的我又去Django官网看了一下相关部分的文档,一堆英文看看大概找到了问题;
我发现我把html页面里面原先加的 {% csrf_token %} 这个东西给删掉了,加上谷歌的相关页面cookie被我一清除,csrftoken就被咔嚓了,再刷新页面,去html页面里也找不到 {% csrf_token %} ,没有了csrftoken那个cookie值,即使有相关的JS代码也毛用没有了;
打个比方:
总结下来:
需要引入的相关JS代码
1 $(document).ajaxSend(function(event, xhr, settings) { 2 function getCookie(name) { 3 var cookieValue = null; 4 if (document.cookie && document.cookie != ‘‘) { 5 var cookies = document.cookie.split(‘;‘); 6 for (var i = 0; i < cookies.length; i++) { 7 var cookie = jQuery.trim(cookies[i]); 8 // Does this cookie string begin with the name we want? 9 if (cookie.substring(0, name.length + 1) == (name + ‘=‘)) { 10 cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); 11 break; 12 } 13 } 14 } 15 return cookieValue; 16 } 17 function sameOrigin(url) { 18 // url could be relative or scheme relative or absolute 19 var host = document.location.host; // host + port 20 var protocol = document.location.protocol; 21 var sr_origin = ‘//‘ + host; 22 var origin = protocol + sr_origin; 23 // Allow absolute or scheme relative URLs to same origin 24 return (url == origin || url.slice(0, origin.length + 1) == origin + ‘/‘) || 25 (url == sr_origin || url.slice(0, sr_origin.length + 1) == sr_origin + ‘/‘) || 26 // or any other URL that isn‘t scheme relative or absolute i.e relative. 27 !(/^(\/\/|http:|https:).*/.test(url)); 28 } 29 function safeMethod(method) { 30 return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method)); 31 } 32 33 if (!safeMethod(settings.type) && sameOrigin(settings.url)) { 34 xhr.setRequestHeader("X-CSRFToken", getCookie(‘csrftoken‘)); 35 } 36 });
Django中ajax发送post请求,报403错误CSRF验证失败解决办法
原文:https://www.cnblogs.com/springionic/p/10816659.html