Объект JSON, отправленный из Javascript в Django Views, пуст - PullRequest
0 голосов
/ 10 ноября 2018

Я пытаюсь отправить некоторые данные из Javascript в Django через ajax. Вот мой код 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");
            }
        });

Вот мой Views.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'

Я взял некоторые ссылки из здесь

Может ли кто-нибудь помочь мне с этим? Если вам нужна дополнительная информация, чтобы решить эту проблему, я буду рад поделиться.

Ответы [ 2 ]

0 голосов
/ 11 ноября 2018

Потеряв половину волос на голове, я решил это следующим образом:

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:

            <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");
            }
        });

Когда я запускаю его, он показывает it didnt work, но я вижу вывод в моем терминале, т.е. данные были переданы.

Я попытался включить токен csrf в запрос ajax, но это не удалось. Поэтому я использовал csrf_exempt в своих представлениях.

Это может быть грязный способ ведения дел, но пока он работает. Если у кого есть аккуратный и лучший ответ, пожалуйста, напишите здесь!

0 голосов
/ 10 ноября 2018

Я написал базовый тестовый пример для 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')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...