Почему мой ответ jQuery.ajax пуст с Django

Я пытаюсь вернуть ответ JSON от вызова представления Django через вызов ajax, как показано ниже:

var tab = 'test';
var response = $.ajax({
    url: "/" + tab + "/"
}).responseText;

alert(response);

Вот мой взгляд на Джанго:

if request.is_ajax() == True:
    req = {}
    req['html'] = '<b>This is a test</b>'
    response = simplejson.dumps(req)
    print response
    return HttpResponse(response, mimetype="application/json")
else:
    return render_to_response("ajax/pingpong.html", {'ajax': ajax})

По какой-то странной причине окно предупреждения пустое (хотя в нем не указано неопределенное). Интересно, что $.post и $.getJSON отлично работают на одном и том же URL. Я также вижу ожидаемый вывод JSON на моей консоли. Любая помощь будет оценена!

5 ответов

Решение

Если я не ошибаюсь, responseText не атрибут ни на что $.ajax() возвращается. Я думаю, что вы должны сделать что-то вроде этого:

$.ajax({
  url: "/test",
  dataType: "json",
  success: function(data) {
    // use data
  }
});

Из-за dataType Параметр, данные, полученные в случае успешного обратного вызова, являются обычным объектом JS. Если вы не укажете dataTypeвы получите строку с необработанным содержимым, которое возвращает сервер.

Вы не устанавливаете dataType параметр для json, и вам нужно получить объект json из функции успеха, попробуйте это:

var tab = 'test';
$.ajax({
    url: "/" + tab + "/",
    dataType: "json",
    success: function(json){
        alert(json);
    }        
});

Попробуйте это вместо этого:

var tab = 'test';
var response = $.ajax({
    url: "/" + tab + "/",
    success: function(data, textStatus) { alert(data); }
});

Хотя в документации утверждается, что ResponseText будет блокировать браузер до тех пор, пока запрос не будет завершен, мне кажется, что вы получаете состояние гонки, т.е. вы предупреждаете переменную до того, как запрос XHR будет завершен. Вам придется сделать что-то вроде этого:

var complete = function(data) {
    console.log(response.responseText);
}
var tab = 'test';
var response = $.ajax({
    url: "/" + tab + "/",
    dataType: "json",
    success : complete
});

У меня та же проблема, но только в определенных условиях. Мне интересно, если ваша проблема такая же. Моя среда:

  1. Запуск внутреннего веб-сервера Django (./manage.py runserver 0.0.0.0:8080)
  2. Просмотр моего сайта в Google Chrome (v4.1.249.1025).

При таких обстоятельствах следующий код jQuery приводит к data = null, status = "success" примерно в половине случаев. В остальное время он возвращает действительный объект для данных.

$.ajax({
   type:"POST",
   url:"response/"+q.id+"/",
   cache:false,
   dataType:"json",
   data:{response:$(this).val()},
   success:function(data, status) {
     alert(data+","+status);
   }, 
   error:function() {
     $(".main_container").text("Error. Please check your internet connection.");
   } 
});
Другие вопросы по тегам