在这种情况下,Django告诉我我的CRSF令牌不再有效
CSRF令牌丢失或不正确
我想这是因为session_id已经改变或类似的东西。
我的断言是否正确?
如何让用户重新提交表单而不必重新加载页面?
答案 0 :(得分:3)
虽然上述方法可用于AJAX POST请求,但它有一些不便之处:您必须记住每次POST请求都将CSRF令牌作为POST数据传递。因此,有一种替代方法:在每个XMLHttpRequest上,将自定义X-CSRFToken标头设置为CSRF标记的值。这通常更容易,因为许多javascript框架提供了允许在每个请求上设置标头的钩子。
您需要通过AJAX调用发送CSRF令牌:
$.ajaxSetup({
beforeSend: function(xhr, settings) {
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;
}
if (!(/^http:.*/.test(settings.url) || /^https:.*/.test(settings.url))) {
// Only send the token to relative URLs i.e. locally.
xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));
}
}
});
以下是参考链接https://docs.djangoproject.com/en/1.6/ref/contrib/csrf/#ajax