用户登录后,我在django电子商务网站上发布ajax时遇到问题。失败的情况如下:
1-)用户来到站点并将产品添加到购物车没有任何问题。将产品添加到购物车是一个ajax调用,代码如下:
function addItemToCart(item_pk, quantity) {
var item_quantity;
if (!quantity) {
item_quantity = 1;
} else {
item_quantity = quantity;
}
$.ajaxSetup({
beforeSend: function(xhr) {
xhr.setRequestHeader('Csrf-Token', csrftoken);
}
});
$.ajax({
type: 'POST',
url: '/api/cart/add-item/',
data: {
item: item_pk,
quantity: item_quantity
}
success: function(data, textStatus, jQxhr) {
updateCart();
},
error: function(jqXhr, textStatus, errorThrown) {
console.log(jqXhr, textStatus, errorThrown);
}
});
}
以上代码可完美运行,用户可以将多个产品添加到购物车中。
2-)之后,用户登录到站点进行付款,但是在进行付款之前,他想将其他产品添加到购物车,但是代码失败。
3-)错误消息如下:“ CSRF失败:CSRF令牌丢失或不正确。”
当我检查请求时,我看到ajax调用已经设置了csrf令牌。我发现的唯一一件事是django在用户登录后刷新了令牌。但我还要确保已使用新的ajax调用设置了csrf标头。
因此,我感到困惑的是,为什么它在用户登录之前有效,而在用户登录之后却无效。因为这两个帖子都是使用正确的csrf令牌发布的。
关于我想念的东西有什么想法吗?
答案 0 :(得分:2)
之所以发生这种情况,是因为Django在POST请求中使用了csrf验证,并且您的AJAX函数未正确传递csrf验证信息。 Django文档中有一个good section on this,概述了使用Django编写成功的AJAX帖子时需要包含的一些其他jQuery函数。
答案 1 :(得分:0)
我已经解决了问题:
问题是令牌头名称。我将标头名称用作“ Csrf-Token”,但我仍然不明白为什么它适用于脱机用户,但应为“ X-CSRFToken”。我不知道这可能是Django 2的错误。