Django + Ajax Сообщение: 403 Запрещено после входа в систему - PullRequest
0 голосов
/ 22 февраля 2019

У меня проблема с сообщениями ajax на моем сайте электронной коммерции django после входа в систему.Сценарий сбоя выглядит следующим образом:

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 Failed: токен CSRF отсутствует или неверен».

Когда я проверил запрос, я вижу, что вызов ajax уже установил токен csrf.Единственное, что я понял, это то, что django обновил токен после входа пользователя.Но я также позаботился о том, чтобы при вызове ajax был установлен заголовок csrf с новым.

Итак, я запутался, почему он работает до входа пользователя и не работает после входа пользователя.Потому что оба сообщения сделаны с правильными токенами csrf.

Есть идеи о том, что мне не хватает?

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Я решил проблему:

Проблема заключалась в названии заголовка токена.Я использовал имя заголовка как «Csrf-Token», и я до сих пор не понимаю, почему оно работает для автономных пользователей, но это должно быть «X-CSRFToken».Может быть, это ошибка для Django 2, я не знаю.

0 голосов
/ 22 февраля 2019

Это происходит потому, что Django использует проверку csrf для запросов POST, а ваша функция AJAX неправильно передает информацию проверки csrf.В документации по Django есть хороший раздел на этом , в котором описаны некоторые дополнительные функции jQuery, которые вам нужно будет включить, чтобы создать успешную запись AJAX с использованием Django.

...