在我正在构建的这个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
的工作方式又如何?我设计了这种对象模式,以节省时间和文本空间,分别写出每个参数,以实现我希望如何处理服务器和客户端之间的数据。
答案 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
});
的更多信息
查看时,您应该:
import json
...
# on the view
data = json.loads(request.body)