我已经看过其中一些问题,但我试图实施他们的解决方案,但它对我没用。
我正在尝试使用POST向django视图发送基本的AJAX请求。这是我的JQuery:
$('#save-button').click(function() {
var names = ['BLOGGS Joe', 'SMITH John'];
data = JSON.stringify(names);
$.ajax({
"contentType": "application/json; charset=utf-8",
"data": data,
"url" : "/ajax/myteam/save/",
"type": "POST",
"success": function(response) {
}
});
});
这是我的Django观点:
def myteam_save(request):
if request.method == 'POST':
if request.POST:
print 'Hurray'
else:
print 'Boo'
response = HttpResponse(json.dumps({'code':'ok'}), content_type='application/json')
return response
当我检查Firebug中发生的事情时,我看到帖子正在按照我的意图制作,但来自request.POST的QueryDict对象总是为空。
我一直小心csrf令牌,我想甚至尝试在我的设置中关闭'django.middleware.csrf.CsrfViewMiddleware',但这似乎没有效果。
我做错了什么?
感谢您的帮助!
答案 0 :(得分:7)
Django
并没有真正为您排序JSON
个有效负载。 request.POST
旨在用于HTML发布的表单等。
对于JSON
个有效负载,您应自行反序列化请求正文,例如:json.loads(request.body)
。
(request.body
是您访问原始有效负载的方式。)
答案 1 :(得分:0)
正如@Sergio所说,您需要在views.py中解码request.body
。这是使用Django 3.1
和Fetch
的解决方案。
def myteam_save(request):
if request.method == 'POST' and request.headers.get("contentType": "application/json"):
body_unicode = request.body.decode('utf-8')
received_json = json.loads(body_unicode)
return JsonResponse(received_json, safe=False)
我对AJAX
不熟悉。因此,我发布了POST
与XHR
的典型Fetch
使用情况。假设varKey
和varValue
是预定义的变量,其值将作为json发送:
根据official documentation,出于安全原因,您必须通过它。
function getCookie(name) {
let cookieValue = null;
if (document.cookie && document.cookie !== '') {
const cookies = document.cookie.split(';');
for (let i = 0; i < cookies.length; i++) {
const cookie = cookies[i].trim();
// Does this cookie string begin with the name we want?
if (cookie.substring(0, name.length + 1) === (name + '=')) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
const csrftoken = getCookie('csrftoken');
以下是使用XHR
完成的实际Fetch
:
dict = { [varKey]: varValue }
fetch("http://127.0.0.1:8000/bot/api/post/45/", {
headers: {
'X-CSRFToken': csrftoken,
"x-Requested-With": "XMLHttpRequest",
"Content-Type": "application/json"
},
method: 'POST',
body: JSON.stringify(dict),
mode: 'same-origin',
})