Я написал базовый тестовый пример для Django 1.11 с Python 3.6 и Python 2.7.
Я использовал для проверки следующий файл шаблона:
<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>
И следующий маршрут, который доставляет файл шаблона и печатает любые данные AJAX:
from django.http import response
from django.shortcuts import render
import json
def index(request):
if request.is_ajax():
request_body = request.body
data = json.loads(request_body)
print(data)
return render(request, 'stackoverflowhelp/index.html')
Мне не удалось воспроизвести проблему.
Однако, проведя дополнительные исследования, я обнаружил, что метод json.loads
в Python 3.6 поддерживает объекты bytes
, тогда как документация для Python 2.7 json.loads
предполагает, что он поддерживает только строковые типы. Хотя опубликованная вами ошибка отражает это, я пытался заставить ее генерировать ту же ошибку, что и вы, но безуспешно.
Как видите, мне не пришлось вносить белый список в метод защиты CSRF. Исходя только из указанной вами ошибки, вызов decode
на request.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')