Javascript Django Python:Can';t访问从Python QueryDict通过AJAX传递的JS对象

Javascript Django Python:Can';t访问从Python QueryDict通过AJAX传递的JS对象,javascript,python,ajax,django,Javascript,Python,Ajax,Django,在我正在构建的这个Django项目中,我使用AJAX通过javascript和python在服务器和客户端之间来回传输数据。为了方便起见,我在JS中设计了一个config对象来携带服务器和响应JS需要知道的重要参数。在Python端,我无法访问这个对象,因为它是None,但是在将POST对象发送和打印到Py控制台之前,先将对象打印到JS控制台,这两种情况都表明存在一些问题。我不明白为什么在QueryDict中访问JS对象(不是memebers)会返回为无 # JavaScript var

在我正在构建的这个Django项目中,我使用AJAX通过javascript和python在服务器和客户端之间来回传输数据。为了方便起见,我在JS中设计了一个
config
对象来携带服务器和响应JS需要知道的重要参数。在Python端,我无法访问这个对象,因为它是
None
,但是在将POST对象发送和打印到Py控制台之前,先将对象打印到JS控制台,这两种情况都表明存在一些问题。我不明白为什么在
QueryDict
中访问JS对象(不是memebers)会返回为无

# 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
#JavaScript
变量objConfig={
参数1:“更多文本数据”,
参数2:“更多文本数据”,
参数3:“更多文本数据”,
};
console.log(objConfig);
$.ajax({
类型:“POST”,
url:url,
数据:{
csrfmiddlewaretoken:strCsrfToken,
strTextData:strTextData,
objConfig:objConfig
},
成功:回调
});
#JS控制台输出:
#对象{param0:“更多文本数据”,param1:“更多文本数据”,param2:“更多文本数据”}
#蟒蛇
def DoTheThing(响应):
打印(response.POST.get('strTextData'))
打印(response.POST.get('objConfig'))
打印(回复邮件)
打印(response.POST.get('objConfig[param0]'))
#Python控制台输出:
#正在发送到服务器的文本数据。
#没有
# 
#更多文本数据
请注意
print(response.POST.get('objConfig'))
prints
None
,但是
print(response.POST.get('objConfig[param0]))
完全按照我的预期打印。 我还注意到在
QueryDict
中,它似乎没有像我期望的那样将
objObject
表示为对象。我理解JS和Py对象之间的差异,但是它使用数组索引操作符分别列出了对象的每个成员,我不知道为什么或者如何正确使用数组索引操作符


我不能只获取整个
objConfig
对象,我需要单独访问每个成员?另外,在HttpResponse中尝试发送
objConfig
,这将如何工作?我设计了这种对象模式,以节省时间和文本空间,分别写出我希望如何在服务器和客户端之间处理这些数据的每个参数。

默认的
内容类型
$.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
});
查看网站上的更多信息

在您的视图上,您应该:

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

我尝试了一下,当我更改内容类型时,CSRF令牌出现了一些错误。上面写着“禁止(CSRF令牌丢失或不正确)只需添加一行。目前正在调查。好的,更改内容类型就是更改出于安全原因我需要传递的CSRF令牌。刚刚编辑/修复,但您可以获得有关此答案的更多详细信息:这很有效!但现在在我将
请求打印到控制台时没有POST数据。我在
请求中找到了我的数据t、 正文的格式非常奇怪。

b'strTextData=Text%20data%20to%20be%20sent%20to%20server。&objConfig%5Bparam0%5D=more%20text%20data&objConfig%5Bparam1%5D=more%20text%20data&objConfig%5Bparam2%5D=more%20text%20data%20data
为答案添加了更多信息。to be必须使用多层嵌套属性处理对象ibutes您应该解析请求主体上的json内容。