Django Python:无法访问从Python QueryDict通过AJAX传递的JS对象

时间:2018-09-06 16:51:45

标签: javascript python ajax django

在我正在构建的这个Django项目中,我使用AJAX通过javascript和python在服务器和客户端之间来回传输数据。为了方便起见,我在JS中设计了一个config对象来继承服务器和响应JS需要知道的重要参数。在Python方面,我无法访问该对象,因为它是None,但是在将对象发送到JS控制台并将其发送到Py控制台并将其打印到py控制台之前,将其输出到JS控制台都表明那里有东西。我不明白为什么在QueryDict中访问JS对象(不是成员)会返回为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对象,我需要分别访问每个成员吗?尝试在HttpResponse中发送objConfig的工作方式又如何?我设计了这种对象模式,以节省时间和文本空间,分别写出每个参数,以实现我希望如何处理服务器和客户端之间的数据。

1 个答案:

答案 0 :(得分:3)

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 documentation

的更多信息

查看时,您应该:

import json
...
# on the view
data = json.loads(request.body)