Сервер разработки Django не обслуживает ошибки из запросов Ajax - PullRequest
0 голосов
/ 22 декабря 2009

Я пытался заставить некоторые Ajax-вещи работать в моем приложении Django, но это было сложно, потому что по какой-то причине ошибки синтаксиса и типов не вызывают сбой сервера и происходят молча. Как это могло быть?

JavaScript (jQuery):

 add_foo = function() {
   var numfoos = $("div#foos_container > div.foo").length + 1;
   var foo_id = numfoos + "-foo";
   var div = $("<div></div>").attr("id",foo_id).addClass("foo");
   div.load("http://localhost:8000/ajax/get/url/");
   div.appendTo("div#foos_container");
    };

Python:

def ajax_add_foo(request):     
  print request.session['editing_foos'].keys()
  keys = request.session['editing_foos'].keys()
  if len(keys) == 0:
    next_key = 1
  else:
    next_key = max([ id_from_prefix(key) for key in keys ])
  print next_key

  form = FooForm(prefix=next_key)
  print next_key
  request.session['editing_foos'].update( {create_prefix(FooForm, next_key) : -1 } ) # This foo is new and has no pkey
  print request.session['editing_foos']
  return render_to_response( 'bar/foo_fragment.html',
        {'fooform' : fooform, },
        context_instance=RequestContext(request))

Ответы [ 4 ]

2 голосов
/ 08 сентября 2010

При ошибках Ajax Django по-прежнему генерирует полный «экран отладки», но не отображается автоматически.

Зарегистрируйте глобальный обработчик ошибок jQuery Ajax, который открывает «responseText» в новом окне: (вставьте этот код в ваш "onready")

$(document).ajaxError(function(event, XMLHttpRequest, ajaxOptions, thrownError){
    // open the Django Debug screen in a new window: 
    var w = window.open('','','');
    w.document.write(XMLHttpRequest.responseText);          
});

Это приводит к тому, что знакомая страница отладки Django всплывает на ошибках ajax.

1 голос
/ 22 декабря 2009

Вероятно, это связано с тем, что сервер возвращает код ошибки (500), а ваш код jQuery ничего не делает в случае ошибки. Не могли бы вы опубликовать код $ .get или $ .post, который вы используете?

РЕДАКТИРОВАТЬ: Если вы используете $ .load, есть место для функции обратного вызова, которую вы можете создать для отображения ошибок. Это довольно просто, вам нужно определить функцию, подобную этой:

function (responseText, textStatus, XMLHttpRequest){
    if (textStatus < 200 || textStatus >= 299){
        $(document).html(responseText);
    }
}

Таким образом, вы поместите сообщение об ошибке во весь документ и увидите его. Я точно не знаю, работает ли вышеизложенное, потому что я не могу проверить это, но вы должны быть в состоянии сконструировать что-то, работающее над этим.

1 голос
/ 22 декабря 2009

Где вы ищете сообщение об ошибке? Очевидно, он не будет отображаться на главной веб-странице, поскольку вы не запросили полное обновление страницы. Лучший способ отладки Ajax - через Firebug, где вы можете посмотреть на вкладке Console - вы увидите строку для каждого Ajax-запроса, которая будет красной, если произошла ошибка. Затем вы можете развернуть эту строку, чтобы увидеть полный ответ, то есть симпатичную трассировку Django, которую вы также можете открыть в новой вкладке.

0 голосов
/ 19 декабря 2010

Если вы используете $ .ajax, есть параметр обратного вызова с ошибкой, это было довольно просто реализовать:

$.ajax({
  ...
  error: function(XMLHttpRequest, textStatus, errorThrown){
    document.write(XMLHttpRequest.responseText);
  },
  ...
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...