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
Может ли кто-нибудь помочь мне? Я схожу с ума по этому поводу!
Ответы
Ответ 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