Django + WebKit = сломанная труба
Я запускаю сервер разработки Django 1.2, и я получаю эти сообщения об ошибках сломанной трубы всякий раз, когда я загружаю страницу с него с помощью 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 ответов
Это не проблема Django. Ваш браузер, скорее всего, делает что-то ошибочное.
Это распространенная ошибка, которая происходит всякий раз, когда ваш браузер закрывает подключение во время работы сервера dev все еще занят отправкой данных.
Регистрация этот билет Джанго для получения дополнительной информации.
недавно я столкнулся с этой проблемой с django v1.1.1 dev server и Chrome 7.0.517.44.
"исправление", которое я обнаружил, всегда выполняет жесткое обновление (удерживайте Shift и нажмите кнопку перезагрузки в Chrome) на странице после начальной загрузки, что заставляет Chrome игнорировать кэш для любых ресурсов, запрошенных обновлением.
таким образом, это заставляет меня поверить, что это проблема с печально известной тенденцией Chrome кэшировать все, что возможно; даже когда не должно. Я предполагаю, что Chrome делает запрос ресурса, а затем сразу же сбрасывает соединение для указанного ресурса, как только он понимает, что ресурс кэширован.
Это было бы почти терпимым обходным путем, за исключением того, что любые запросы AJAX по-прежнему будут вызывать проблемы.
Это может быть связано с ошибкой в функции javascript, отправляющей вызов ajax.
например, функция может быть вызвана событием щелчка по ссылке, и если действие ссылки по умолчанию не предотвращено, вы сразу получите вторичный запрос, и браузер закроет предыдущее соединение, не дожидаясь завершения ответа.
У меня была такая же проблема, когда я забыл добавить return false
обработчику событий.
такой же симптом может произойти если обработчик событий, запускающий ajax, создает исключение.
тщательно отлаживайте функцию, выполняющую запрос ajax, и возвращаемое значение этой функции.
прорыв трубы происходит, когда браузер закрывает соединение с сервером. Эта проблема произошла со мной раньше по запросу AJAX post, связанному с <a href="...
потому что я забыл добавить e.preventDefault()
в функции обработчика щелчка. Итак, произошло то, что браузер отправляет запрос post и закрывает соединение и отправляет другой запрос get. Таким образом, вы увидите, как запрос post был отменен браузером.
У меня была, возможно, связанная проблема.
при использовании Safari и Chrome в Windows, на моем локальном компьютере на моем Django runserver,некоторые представления случайным образом не возвращали ответ на запросы AJAX POST.
решение было такое:
данные, которые я передавал в представление через POST, были только одной парой key/val: "action=remove". На самом деле я не использовал эти данные в своем представлении. Как только я назначил данные var на мой взгляд, (т. е. foo = запрос.POST ['action']), представление будет возвращать ответ на запросы ajax каждый раз.
абсолютно сумасшедший!
в случае, если это происходит с 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