从Javascript发送到Django视图的JSON对象为空
我正试图通过ajax将一些数据从Javascript发送到Django。 以下是我的JS代码:从Javascript发送到Django视图的JSON对象为空,javascript,json,ajax,django,Javascript,Json,Ajax,Django,我正试图通过ajax将一些数据从Javascript发送到Django。 以下是我的JS代码: var json_name = {'name': 123} $.ajax({ method: 'POST', url: 'my url', contentType: "application/json", headers: {
var json_name = {'name': 123}
$.ajax({
method: 'POST',
url: 'my url',
contentType: "application/json",
headers: {
'Content-Type':'application/json',
'X-CSRFToken': "{{ csrf_token }}"
},
data: JSON.stringify(json_name),
success: function (data) {
//this gets called when server returns an OK response
alert("it worked!");
},
error: function (data) {
alert("it didnt work");
}
});
<script type="text/javascript" src="http://code.jquery.com/jquery-1.7.1.min.js"></script>
$.ajax({
type: 'POST',
url: 'my url',
// contentType: "application/json",
// headers: {
// 'Content-Type':'application/json',
// 'X-CSRFToken': "{{ csrf_token }}"
// },
dataType: "json",
data: {
senddata: JSON.stringify(json_name),
},
// data: json_name,
success: function (data) {
//this gets called when server returns an OK response
alert("it worked!");
},
error: function (data) {
alert("it didnt work");
}
});
以下是我的视图.py:
def myview(request):
if request.is_ajax():
request_data = request.body
# data = json.loads(request.body)
print(request_data)
# print(data)
return render(request, 'candidate/view.html')
else:
return render(request, 'candidate/view.html')
我得到的输出为b'
当我尝试包含这些行时:
data = json.loads(request.body)
print(data)
我得到这个错误:
TypeError: the JSON object must be str, not 'bytes'
我从你那里得到了一些参考资料
有人能帮我吗?如果您需要任何其他信息来解决这个问题,我很乐意与您分享 我已经用Python3.6和Python2.7在Django 1.11上编写了一个基本测试用例 我一直在使用以下模板文件进行测试:
<button>Send data</button>
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
<script>
$('button').on('click', function(event) {
var data = { name: 123 };
$.ajax({
method: 'POST',
url: '',
contentType: 'application/json',
headers: {
'X-CSRFToken': '{{ csrf_token }}',
},
data: JSON.stringify(data),
success: function() {
console.log('Success!');
},
error: function() {
console.log('Error...');
},
});
});
</script>
我无法重现这个问题
然而,在做了更多的研究之后,我发现Python3.6中的json.loads
方法支持bytes
对象,而建议它只支持字符串类型。虽然您发布的错误反映了这一点,但我试图使其生成与您看到的相同的错误,但没有成功
如您所见,我不必将CSRF保护中的方法列入白名单。纯粹基于您提供的错误,在请求时调用decode
。body
可能会起作用:
def index(request):
if request.is_ajax():
request_body = request.body.decode("utf-8")
data = json.loads(request_body)
print(data)
return render(request, 'stackoverflowhelp/index.html')
在我的头发掉了一半后,我用以下方法解决了这个问题: views.py:
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def myview(request):
if request.is_ajax():
if request.method == 'POST':
data = request.POST.get('senddata')
print(data)
return render(request, 'candidate/view.html')
else:
return render(request, 'candidate/view.html')
我的JS代码:
var json_name = {'name': 123}
$.ajax({
method: 'POST',
url: 'my url',
contentType: "application/json",
headers: {
'Content-Type':'application/json',
'X-CSRFToken': "{{ csrf_token }}"
},
data: JSON.stringify(json_name),
success: function (data) {
//this gets called when server returns an OK response
alert("it worked!");
},
error: function (data) {
alert("it didnt work");
}
});
<script type="text/javascript" src="http://code.jquery.com/jquery-1.7.1.min.js"></script>
$.ajax({
type: 'POST',
url: 'my url',
// contentType: "application/json",
// headers: {
// 'Content-Type':'application/json',
// 'X-CSRFToken': "{{ csrf_token }}"
// },
dataType: "json",
data: {
senddata: JSON.stringify(json_name),
},
// data: json_name,
success: function (data) {
//this gets called when server returns an OK response
alert("it worked!");
},
error: function (data) {
alert("it didnt work");
}
});
$.ajax({
键入:“POST”,
url:“我的url”,
//contentType:“应用程序/json”,
//标题:{
//“内容类型”:“应用程序/json”,
//'X-CSRFToken':“{{csrf_token}”
// },
数据类型:“json”,
数据:{
senddata:JSON.stringify(JSON_名称),
},
//数据:json_名称,
成功:功能(数据){
//当服务器返回OK响应时调用此函数
警惕(“成功了!”);
},
错误:函数(数据){
警惕(“它不起作用”);
}
});
当我运行它时,它显示它不工作
,但我可以在终端中看到输出,即数据被传递
我尝试在ajax请求中包含csrf令牌,但失败了。因此,我在我的观点中使用了csrf_豁免
这可能是一种肮脏的做事方式,但它现在起作用了。如果有人有一个整洁和更好的答案,请张贴在这里 那么
json\u name
在JavaScript中包含什么?在发送请求之前,您是否检查了它是否按预期填充?是的,我在发送请求之前放置了console.log(json_name),并将其输出为:{name:123}
您是如何触发该Ajax帖子的?是按一下按钮吗?如果是,您是否调用了preventDefault()
?显示脚本的其余部分和html?是否尝试data=json.loads(request.body.decode('utf-8')打印(数据)method:'POST',url:'my url',contentType:'application/json',headers:{'Content-Type':'application/json',X-CSRFToken:'{{csrf_token}},数据类型:“json”,processData:false,data:json_name,
感谢您提供的信息,它让我对概念有了一些理解。但是,我仍然得到了与b''
相同的输出。我看不出这个答案有什么关系。OP已经在将数据转换为json字符串。和dataType
用于服务器返回的数据,而不是发送的数据。你说得对,对不起。我以前见过这种问题,通常是因为JQuery将数据编码为查询字符串。我已经编写了一个测试用例,它似乎正确地发送了数据。我将用解决方案修改我的答案。