26

我正在运行 Django 1.2 开发服务器,每当我使用 Chrome 或 Safari 从其中加载页面时,都会收到这些 Broken Pipe 错误消息。我的同事从他的开发服务器加载页面时也遇到了错误。我们在使用 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

谁能帮我吗?我要疯了!

4

6 回答 6

22

这不是 Django 问题。您的浏览器很可能在做一些错误的事情。

这是一个常见错误,当您的浏览器关闭连接而开发服务器仍在忙于发送数据时,就会发生这种错误。

查看此 Django 票以获取更多信息。

于 2010-05-19T18:01:12.777 回答
13

我最近在 django v1.1.1 开发服务器和 Chrome 7.0.517.44 上遇到了这个问题。

我发现的“修复”总是在初始加载后在页面上进行硬刷新(按住 Shift 并单击 Chrome 中的重新加载按钮),这导致 Chrome 忽略它对刷新请求的任何资源的缓存。

因此,这让我相信 Chrome 臭名昭著的倾向于缓存所有可能的东西是一个问题。即使它不应该。我的猜测是 Chrome 正在发出资源请求,然后一旦意识到它已经缓存了资源,就会立即断开该资源的连接。

这几乎是一个可以忍受的解决方法,除非任何 AJAX 请求仍然会导致问题。

于 2010-11-11T21:07:49.707 回答
7

这可能是由于分派 ajax 调用的 javascript 函数中的错误所致。

例如,该功能可能由链接上的点击事件触发,如果不阻止链接的默认操作,您将立即获得二次请求,浏览器将关闭之前的连接,而不等待响应完成. 当我忘记添加return false到事件处理程序时,我遇到了同样的问题。

如果触发 ajax 的事件处理程序抛出异常,也会出现同样的症状。

仔细调试发出 ajax 请求的函数和该函数的返回值。

于 2012-06-01T09:20:01.763 回答
3

当浏览器关闭与服务器的连接时,会发生损坏的管道。这个问题发生在我之前与相关的 ajax 发布请求上,<a href="...因为我忘记添加e.preventDefault()点击处理程序函数。所以发生的事情是浏览器发送 post 请求并关闭连接并发送另一个 get 请求。所以你会看到发布请求被浏览器取消了。

于 2012-05-23T07:43:42.633 回答
2

我有一个可能相关的问题。

在 Windows 上使用 Safari 和 Chrome 时,在我的 django runserver 上的本地计算机上,某些视图随机未返回对 ajax POST 请求的响应。

解决方案是这样的:

我通过 POST 传递给视图的数据只是一对键/值:“action=remove”。现在,在我看来,我实际上并没有使用这些数据。一旦我将数据分配给视图中的 var(即 foo = request.POST['action']),视图每次都会返回对 ajax 请求的响应。

绝对疯了!

于 2010-10-19T17:28:46.840 回答
0

如果客户端发生这种情况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
于 2015-05-28T15:21:54.910 回答