Получение байтов при использовании axios - PullRequest
0 голосов
/ 07 января 2020

Я отправляю пост-запрос с фронта, используя ax ios

var data = {
    key1: value1,
};

axios.defaults.xsrfCookieName = 'csrftoken';
axios.defaults.xsrfHeaderName = "X-CSRFTOKEN";
axios({
    method: 'post',
    url: 'my_url',
    headers: {
        'Accept': 'application/json',
        'Content-Type': 'application/json; charset=utf-8'
    },
    data: JSON.stringify(data),
}).then(function (response) {
    console.log(response);
});

Но на django -backend я получил объект байтов b'{"key1":"value1"}'

Есть ли способ получить json объект на сервере? Или мне нужно декодировать запрос?

1 Ответ

1 голос
/ 07 января 2020

Вам не нужно использовать JSON.stringify с топором ios. Топор ios обрабатывает его изнутри. Просто отправьте простой объект javascript на сервер, например,

axios({
    method: 'post',
    url: 'my_url',
    headers: {
        'Accept': 'application/json',
        'Content-Type': 'application/json; charset=utf-8'
    },
    data: data,
})

. Если вы используете stringify, Ax ios принимает эту строку как JSON и снова внутренне ее строкизирует, поэтому вы Django не может декодировать его.

РЕДАКТИРОВАТЬ В соответствии с вашим комментарием к вопросу, я вижу, что вы используете простое представление Django для обработки запроса. Django представления используют WSGIRequest объект в качестве параметра запроса. Поскольку JSON отправляется как тело запроса, они ничего не делают с ним (не анализируют) и представляют исходные данные как есть. вот почему вы видите байтовый объект как request.body. Вы можете вручную проанализировать его, используя модуль json из python стандартной библиотеки, например, так:

request.data = json.loads(request.body)

Или, если вы хотите больше API-совместимого объекта запроса, я рекомендую использовать декоратор api_view из Django rest фреймворк, подобный этому

@api_view(http_allowed_methods=['post'])
def func(request):
    pass

Он обернет ваш запрос объектом Request из модуля rest_framework.request, который будет обрабатывать все ваши разборы и представлять проанализированные данные как request.data. Подробнее об этом можно прочитать здесь .

...