Почему я получаю MultiValueDictKeyError каждый раз, когда пытаюсь получить данные из запроса POST? - PullRequest
0 голосов
/ 27 мая 2020

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

пополнение. html


            let data = new FormData();

            data.append('amount', document.getElementById('amount').value);

            data.append('csrfmiddlewaretoken', "{{ csrf_token }}");



            var response = fetch('{% url "secret" %}', {
              method: 'POST',
              body: data,
              credentials: 'same-origin',

            })

views.py

def secret(request):
    amount = request.POST["amount"]

error:

MultiValueDictKeyError в / secret 'amount' Метод запроса: GET URL-адрес запроса: http://127.0.0.1: 8000 / секрет Django Версия: 3.0.6 Тип исключения: MultiValueDictKeyError Значение исключения:
Местоположение исключения 'amount': C : \ Users \ eric3 \ AppData \ Local \ Programs \ Python \ Python38-32 \ lib \ site-packages \ django \ utils \ datastructures.py в getitem , строка 78 Python Исполняемый файл: C : \ Users \ eric3 \ AppData \ Local \ Programs \ Python \ Python38-32 \ python .exe Python Версия: 3.8.2

Django Ошибка

Буду очень признателен за помощь.

Спасибо!

1 Ответ

0 голосов
/ 28 мая 2020

Вы получаете исключение MultiValueDictKeyError при открытии этого URL-адреса, потому что, когда request.POST["amount"] оценивается, он не находит в словаре POST элемента с ключом с именем 'amount'.

По-видимому, вы хотите secret view - это представление, которое будет достигнуто только через ajax вызовов, но не будет доступно для пользователя. Если вы этого не хотите, чтобы избавиться от исключения, возникающего, когда не- ajax запросы достигают представления, сделайте следующее:

def secret(request):
    amount = request.POST.get("amount")
    # ... all your other code

Теперь не имеет значения, если ваше представление используется пользователем или вызовом ajax, это исключение исчезнет.

С другой стороны, документация рекомендует использовать канонический токен csrf, включенный в файлы cookie, когда выполнение метода POST запросов через ajax. Для этого убедитесь, что вы поместили 'X-CSRFToken' в заголовки HTTP-запроса.

Код JavaScript должен выглядеть примерно так:

/* Create FormData instance and append the field that you want */
let data = new FormData();
data.append('amount', document.getElementById('amount').value);

/* Perform the fetch call */
fetch("{% url 'secret' %}", {
    method: 'POST',
    body: data,
    headers: {'X-CSRFToken': csrftoken}
    })
    /* Do whatever you do when a response (successful or not) has been received */
    .then(response => {
        console.log(response);
    })


/* Get csrf cookie */
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 = cookies[i].trim();
            if (cookie.substring(0, name.length + 1) === (name + '=')) {
                cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                break;
            }
        }
    }
    return cookieValue;
}
var csrftoken = getCookie('csrftoken');

Как сказано в docs , вы можете значительно упростить процесс получения повара ie, используя JavaScript Cook ie Библиотеку

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