Подтвердить что ты не робот

Django + WebKit = Разбитая труба

Я запускаю сервер разработки 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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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

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

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

Отлаживайте внимательно функцию, создающую запрос ajax и возвращаемое значение этой функции.

Ответ 4

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

Ответ 5

У меня была связанная с этим проблема.

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

Решением было следующее:

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

Абсолютно безумный!

Ответ 6

В случае, если это происходит с клиентом 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