Django Python: невозможно получить доступ к объекту JS, переданному через AJAX из Python QueryDict - PullRequest
0 голосов
/ 06 сентября 2018

В этом Django-проекте, который я создаю, у меня есть данные, идущие туда-сюда между сервером и клиентом через javascript и python с использованием AJAX. Для удобства я разработал объект config в JS для передачи важных параметров, которые должен знать сервер и отвечающий JS. Со стороны Python я не могу получить доступ к этому объекту, потому что это None, но печать объекта на консоль JS перед отправкой и печать объекта POST на консоль Py оба показывает, что что-то есть. Я не понимаю, почему доступ к объекту JS (не к его элементам) в QueryDict возвращается как None.

# JavaScript   

var objConfig = {
   param1: "more text data",
   param2: "more text data",
   param3: "more text data",
};

console.log(objConfig);

$.ajax({
   type: "POST",
   url: url,
   data: {
      csrfmiddlewaretoken: strCsrfToken,
      strTextData: strTextData,
      objConfig: objConfig
   },
   success: callback
});

# JS console output:
# Object {param0: "more text data", param1: "more text data", param2: "more text data"}


# Python
def DoTheThing(response):
   print(response.POST.get('strTextData'))
   print(response.POST.get('objConfig'))
   print(response.POST)
   print(response.POST.get('objConfig[param0]'))

# Python console output:
# Text data being sent to server.
# None
# <QueryDict: {'csrfmiddlewaretoken': ['...'], 'strTextData': ['Text data being sent to server.'], 'objConfig[param0]': ['more text data'], 'objConfig[param1]': ['more text data'], 'objConfig[param2]': ['more text data']}>
# more text data

Обратите внимание, как print(response.POST.get('objConfig')) печатает None, но print(response.POST.get('objConfig[param0]')) печатает именно то, что я ожидал. Я также заметил в QueryDict, что, похоже, objObject не представлен как объект, как я ожидал. Я понимаю из-за различий между объектами JS и Py, но каждый член объекта перечисляется индивидуально с помощью оператора индекса массива, который я не уверен, почему или как использовать правильно.

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

1 Ответ

0 голосов
/ 06 сентября 2018

Значение по умолчанию Content-Type из $.ajax() равно 'application/x-www-form-urlencoded; charset=UTF-8'. Проблема должна быть решена, если вы измените ее на application/json.

Пример:

var data = {
    strTextData: strTextData,
    objConfig: objConfig
}

$.ajax({
   type: "POST",
   url: url,
   contentType : "application/json; charset=utf-8",
   headers: { "X-CSRFToken": strCsrfToken },
   data: JSON.stringify(data),
   success: callback
});

Проверьте дополнительную информацию в документации Jquery

По вашему мнению вы должны:

import json
...
# on the view
data = json.loads(request.body)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...