Django + Ajax Post:403用户登录后禁止

时间:2019-02-22 13:53:45

标签: ajax django post csrf

用户登录后,我在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令牌发布的。

关于我想念的东西有什么想法吗?

2 个答案:

答案 0 :(得分:2)

之所以发生这种情况,是因为Django在POST请求中使用了csrf验证,并且您的AJAX函数未正确传递csrf验证信息。 Django文档中有一个good section on this,概述了使用Django编写成功的AJAX帖子时需要包含的一些其他jQuery函数。

答案 1 :(得分:0)

我已经解决了问题:

问题是令牌头名称。我将标头名称用作“ Csrf-Token”,但我仍然不明白为什么它适用于脱机用户,但应为“ X-CSRFToken”。我不知道这可能是Django 2的错误。