Исключение в Django при вызове AJAX - PullRequest
2 голосов
/ 26 февраля 2011

Я разработал веб-приложение с Django. Он вызывает AJAX (с jQuery $.ajax), чтобы обновить изображение на основе определенного входного текста. Для этого используется следующий код:

$('img#diagram').attr('src', '/images/ajax/ajax_loader.gif');
$.ajax({
    type:       'POST',
    url:        '/draw/',
    data:       { 'diagram':  $('#diagram-text').val() },
    cache:      false,
    success:    function(mesg, txtStatus, XmlHttpRequest) {
        result = $.parseJSON(mesg);
        if (result['error']) {
            alert('An error was encountered: ' + result['error']);
        }
        else {
            $('img#diagram').attr('src', result['diagram_url']);
        }
    },
    error:      function(XmlHttpRequet, txtStatus, errorThrown) {
        alert('Failed to draw the diagram!\n' + errorThrown);
    },
    dataType:   'html'
});

Он работает правильно, т.е. обновляет изображение после изменения входных данных и нажатия кнопки «Рисовать».

Проблема в том, что если я ничего не ввожу и нажимаю кнопку «Рисовать», изображение загрузчика AJAX остается там. Теперь ничего не произойдет, если я выполню одно из следующих действий:

  • Введите текст и нажмите кнопку «Рисовать»
  • Перезагрузить страницу

На самом деле, страница не перезагружается.

Если я сейчас остановлю сервер разработки Django, я получу следующую ошибку:

Exception happened during processing of request from ('127.0.0.1', 44166)
Unhandled exception in thread started by <function inner_run at 0x9f6d5dc>
Error in sys.excepthook:
Traceback (most recent call last):
  File "/usr/lib/python2.6/dist-packages/apport_python_hook.py", line 48, in apport_excepthook
    if not enabled():
TypeError: 'NoneType' object is not callable

Original exception was:
Traceback (most recent call last):
  File "/usr/local/lib/python2.6/dist-packages/django/core/management/commands/runserver.py", line 60, in inner_run
    run(addr, int(port), handler)
  File "/usr/local/lib/python2.6/dist-packages/django/core/servers/basehttp.py", line 721, in run
    httpd.serve_forever()
  File "/usr/lib/python2.6/SocketServer.py", line 226, in serve_forever
    self._handle_request_noblock()
  File "/usr/lib/python2.6/SocketServer.py", line 283, in _handle_request_noblock
    self.handle_error(request, client_address)
  File "/usr/lib/python2.6/SocketServer.py", line 335, in handle_error
    import traceback
ImportError: No module named traceback

Может кто-нибудь предложить что-нибудь? Конечно, я могу поставить проверку, чтобы предотвратить пустые строки. Но почему это действительно происходит, поскольку AJAX является асинхронным?

1 Ответ

1 голос
/ 20 декабря 2012

Это происходит, когда клиент закрывает соединение до того, как сервер завершил отправку данных.

попробуйте функцию done вместо успеха.

   $.ajax({
        url: "/draw/",
        type: "POST",
        data: { 'diagram':  $('#diagram-text').val() },
    }).done(function(data) {
        result = $.parseJSON(mesg);
        if (result['error']) {
          alert('An error was encountered: ' + result['error']);
        }
        else {
            $('img#diagram').attr('src', result['diagram_url']);
        }
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...