Django + WebKit = Разбитая труба - PullRequest
26 голосов
/ 19 мая 2010

Я использую сервер разработки Django 1.2 и получаю эти сообщения об ошибках Broken Pipe всякий раз, когда загружаю страницу с него в Chrome или Safari. Мой коллега также получает ошибку, когда он загружает страницу со своего сервера разработки. У нас нет этих ошибок при использовании Opera или Firefox.

Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/django/core/servers/basehttp.py", line 281, in run self.finish_response()
File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/django/core/servers/basehttp.py", line 321, in finish_response self.write(data)
File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/django/core/servers/basehttp.py", line 417, in write self._write(data)
File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/socket.py", line 300, in write self.flush()
File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/socket.py", line 286, in flush self._sock.sendall(buffer)
error: [Errno 32] Broken pipe

Кто-нибудь может мне помочь? Я схожу с ума по этому поводу!

Ответы [ 6 ]

22 голосов
/ 19 мая 2010

Это не проблема Django. Ваш браузер, скорее всего, делает что-то ошибочное.

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

Проверьте этот билет Django для получения дополнительной информации.

13 голосов
/ 12 ноября 2010

Я только недавно столкнулся с этой проблемой с сервером разработки django v1.1.1 и Chrome 7.0.517.44.

«Исправление», которое я обнаружил, всегда делает полное обновление (удерживая Shift и нажимая кнопку перезагрузки в Chrome) на странице после начальной загрузки, что заставляет Chrome игнорировать свой кеш для любых ресурсов, запрошенных обновить.

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

Это почти приемлемый обходной путь, за исключением того, что любые запросы AJAX по-прежнему будут вызывать проблемы.

7 голосов
/ 01 июня 2012

Это может быть связано с ошибкой в ​​функции javascript, отправляющей вызов ajax.

Например, функция может быть вызвана событием щелчка по ссылке, и если действие ссылки по умолчанию не предотвращено, вы сразу получите вторичный запрос, и браузер закроет предыдущее соединение, не ожидая ответ до конца. У меня была такая же проблема, когда я забыл добавить return false в обработчик событий.

Тот же симптом может возникнуть, если обработчик событий, запускающий ajax, выдает исключение.

Тщательно отлаживайте функцию, выполняющую ajax-запрос, и возвращайте значение этой функции.

3 голосов
/ 23 мая 2012

Разрыв канала происходит, когда браузер закрывает соединение с сервером. Эта проблема случалась со мной раньше при отправке запроса ajax, связанного с <a href="..., потому что я забыл добавить e.preventDefault() в функцию обработчика кликов. Так что случилось, что браузер отправил запрос на публикацию, закрыл соединение и отправил еще один запрос на получение. Таким образом, вы увидите, что запрос на публикацию сообщения был отменен браузером.

2 голосов
/ 19 октября 2010

У меня была, возможно, связанная проблема.

При использовании Safari и Chrome в Windows на моем локальном компьютере на моем сервере запуска django некоторые представления случайно не возвращали ответ на запросы ajax POST.

Решение было таким:

Данные, которые я передавал в представление через POST, представляли собой всего одну пару ключ / вал: «действие = удаление». Я не использовал эти данные на мой взгляд. Как только я назначил данные переменной в моем представлении (то есть foo = request.POST ['action']), представление будет возвращать ответ на запросы ajax каждый раз.

Абсолютно сумасшедший!

0 голосов
/ 28 мая 2015

В случае, если это происходит с клиентом JavaScript, решение может быть следующим. Вы должны добавить preventDefault и return false в начале и в конце вашего обработчика событий, например:

$('#btn_analyze').click(function(e) {
    e.preventDefault()
    $.post('/api/v1/analyzer/',
        data,
        "json").done(function(response) {
        //...
    }).fail(function() {
        Logger.error(" Error ")
    })

    return false
}) // analyze click
...