Django плюс jQuery Ajax: не удается добавить csrf_token в форму при предотвращении по умолчанию, добавлении данных и повторной отправке - PullRequest
0 голосов
/ 13 декабря 2018

Это первый раз, когда я пишу, я надеюсь, что я делаю это правильно.Я потратил несколько дней на эту проблему, и, кажется, я просто не могу найти решение.

Мне нужно добавить данные в форму перед отправкой.Данные, которые я добавляю, немного сложны, поэтому они должны входить в объект JSON (он включает в себя характеристику ранее нарисованного многоугольника на той же странице).

HTML выглядит так:

<form id="form-submit-data" action="{% url 'app_name:submit-data' %}" method="POST">
  {% csrf_token %}
  <input type="text" id="input-value"  name="my-value">
  <input type="submit" value="Confirm">
</form>

После нескольких дней копания я согласился на приведенную ниже реализацию (это следует из ответа Кори Дэниелсон с 61 голосом, размещенным здесь: Как вызвать событие после использования события.protectDefault () ).

Проблема в том, что если я добавлю декоратор @csrf_exempt в функцию моих просмотров, моя форма будет отправлена ​​дважды, один раз с правильно отформатированными данными и один раз, как это выглядит "csrfmiddlewaretoken = 2cYsUn5m50RU1oFwOjPsGpCY5HBelIjQPOOV52KoTpQMWE2zRPzwsDA0UKrI7ZFj & my-value = 35" :

* * * * * * * * * * * * * * * * * * * * * * * * * * * 101 '* * * * * * * * * * * * * Я не могу сделать 10-й запрос, чтобы сделать первый комментарий в моем ответе на запрос (когда я делаю это), когда я пытаюсь добавить 10-й запрос в ответ на запрос, который я пытаюсь добавить в ответ на запрос (10-й) в моем ответе на запрос "в ответ на запрос"Запрещено (токен CSRF отсутствует или неверен.)"ошибка 403, и когда я обновляюсь, я получаю" код 400, сообщение Неверный синтаксис запроса ('{[мои данные отформатированы правильно]} GET [URL страницы, которая имелаформа] HTTP / 1.1 ')".

(Мой браузер принимает файлы cookie. Моя функция просмотра передает запрос методу рендеринга шаблона, и я использую CsrfViewMiddleware (в ответ на сообщение django, на которое я перенаправлен в режиме отладки)).

Здесь ниже мой jQuery (когда я добавляю декоратор @csrf_exempt в моих представлениях):

// flag to know if the preprocessing has been done
var preprocessingDone = false;

// stops forms from submitting, adds data previously gathered and resumes submission
$('#form-submit-data').submit(function(event, options) {
    options = options || {};

    if (!options.preprocessingDone) {
        event.preventDefault();
        var formData = gatheredData; // from global var
        formData["myValue"] = $('#input-value').val();
        $.ajax({
            //headers: {'X-CSRFToken': '{{ csrf_token }}'},
            url: $(this).attr('action'),
            type: 'POST',
            contentType: 'application/json; charset=utf-8',
            data: JSON.stringify(formData),
            dataType: 'text',
            success: function(data){
                console.log("DATA POSTED SUCCESSFULLY" + data);
            },
            error: function(jqXhr, textStatus, errorThrown){
                console.log(errorThrown);
            }
        }).then(function() {
            // retrigger form submit
            $(event.currentTarget).trigger('submit', {'preprocessingDone': true});
        });
    }
});

(тогда как, когда я пытаюсь использовать csrf_token, я удаляю комментарий к аргументу заголовков вызова ajax).

Насколько я понимаю, чтоданные отправляются дважды, один раз с добавленными данными, но без csrf_token, и один раз только с данными формы без добавленных данных, но с csrf_token.

Как добавить дополнительные данные в форму, иметь действительный csrf_token иотправить данные только один раз?Ваш вклад очень важен.

PS: я знаю, что получение данных из глобальной переменной - плохая практика, но на этом я остановился после нескольких дней испытаний.Я не уверен, что это (сбор данных) может быть решено в исходном запросе, поэтому я не обязательно включаю его в вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...