500 (Внутренняя ошибка сервера) и Неожиданная лексема < в JSON в позиции 0
Я пытаюсь создать сайт на основе справочников. Когда дело дошло до обновления корзины через кнопки (уменьшение и увеличение), то при попытке нажать на них, выдаются ошибки: Uncaught (in promise) SyntaxError: Unexpected token < in JSON at position 0, which refers to
.then((data) => {
location.reload()
});
cart.js:24 POST http://127.0.0.1:8000/update_item/ 500 (Внутренняя ошибка сервера) который относится к
fetch(url, {
method:'POST',
headers:{
'Content-Type':'application/json',
'X-CSRFToken': csrftoken,
},
и у меня ошибка в консоли pycharm строка 104, в updateItem productId = data['productId'] KeyError: 'productId'
code cart.js:
var updateBtns = document.getElementsByClassName('update-cart')
for (i = 0; i < updateBtns.length; i++) {
updateBtns[i].addEventListener('click', function () {
var productId = this.dataset.stuff
var action = this.dataset.action
console.log('productId:', productId, 'Action:', action)
console.log('USER:', user)
if (user == 'AnonymousUser') {
console.log('User is not authenticated')
} else {
updateUserOrder(productId, action)
}
})
}
function updateUserOrder(productId, action){
console.log('User is authenticated, sending data...')
var url = '/update_item/'
fetch(url, {
method:'POST',
headers:{
'Content-Type':'application/json',
'X-CSRFToken': csrftoken,
},
body:JSON.stringify({'productId':productId, 'action':action})
})
.then((response) => {
return response.json();
})
.then((data) => {
location.reload()
});
}
views.py
def updateItem(request):
data = json.loads(request.body)
productId = data['productId']
action = data['action']
print('Action:', action)
print('Product:', productId)
customer = request.user.customer
product = Stuff.objects.get(id=productId)
order, created = Order.objects.get_or_create(customer=customer, complete=False)
orderItem, created = OrderItem.objects.get_or_create(order=order, product=product)
if action == 'add':
orderItem.quantity = (orderItem.quantity + 1)
elif action == 'remove':
orderItem.quantity = (orderItem.quantity - 1)
orderItem.save()
if orderItem.quantity <= 0:
orderItem.delete()
return JsonResponse('Item was added', safe=False)
Заранее благодарю
Какая у вас версия Python? Начиная с Python 3.0 json.loads() принимает только строку в юникоде. Возможно, проблема в том, что вам нужно сначала декодировать request.body:
data = json.loads(request.body.decode('utf-8'))
Если проблема не в этом, попробуйте проверить, что вы получаете. Потому что символ "<" выглядит как html или xml. Например, измените вашу функцию на:
def updateItem(request):
data = json.loads(request.body)
return HttpResponse(data)