Django + WebKit =破管

时间:2010-05-19 17:57:20

标签: django webkit broken-pipe

我正在运行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

任何人都可以帮助我吗?我为此疯狂了!

6 个答案:

答案 0 :(得分:22)

这不是Django问题。您的浏览器很可能做错了。

  

这是常见的错误   每当您的浏览器关闭时   开发服务器的连接   还在忙着发送数据。

查看this Django ticket了解详情。

答案 1 :(得分:13)

我刚刚使用django v1.1.1 dev服务器和Chrome 7.0.517.44遇到了这个问题。

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

因此,这让我相信这是Chrome的臭名昭着的一个问题,它可以缓存所有可能的东西;即使它不应该。我的猜测是Chrome正在发出资源请求,然后一旦意识到资源被缓存就会立即删除该资源的连接。

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

答案 2 :(得分:7)

这可能是因为调度ajax调用的javascript函数出错了。

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

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

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

答案 3 :(得分:3)

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

答案 4 :(得分:2)

答案 5 :(得分:0)

如果JavaScript客户端发生这种情况,可以采用以下解决方案。 您必须在事件处理程序的开头和结尾添加preventDefaultreturn 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