代码之家  ›  专栏  ›  技术社区  ›  jmagnusson

django+webkit=管道破裂

  •  26
  • jmagnusson  · 技术社区  · 16 年前

    我正在运行Django1.2开发服务器,每当我用chrome或safari从中加载一个页面时,都会收到这些中断的管道错误消息。当我的同事从他的dev服务器加载一个页面时,也会收到错误。在使用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 回复  |  直到 11 年前
        1
  •  22
  •   Yuval Adam    16 年前

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

    这是常见的错误 每当浏览器关闭时, 当dev服务器 仍在忙于发送数据。

    检查 this Django ticket 更多信息。

        2
  •  13
  •   mateolargo    15 年前

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

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

    因此,这让我相信这是Chrome臭名昭著地倾向于缓存它所能缓存的所有东西的问题,即使它不应该这样做。我猜Chrome是在发出资源请求,然后在意识到缓存了资源后立即断开对所述资源的连接。

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

        3
  •  7
  •   Evgeny    14 年前

    这可能是由于在发送Ajax调用的javascript函数中出现错误造成的。

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

    如果触发Ajax的事件处理程序引发异常,也会出现相同的症状。

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

        4
  •  3
  •   dosht    13 年前

    当浏览器关闭与服务器的连接时,会发生断开的管道。我以前在Ajax post请求中遇到过这个问题 <a href="... 因为我忘了补充 e.preventDefault() 在click handler函数中。所以发生的事情是浏览器发送POST请求并关闭连接并发送另一个GET请求。因此,您将看到发布请求被浏览器取消了。

        5
  •  2
  •   Dave    15 年前

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

    在Windows上使用Safari和Chrome时,在Django运行服务器上的本地计算机上, 一些 视图随机不返回对Ajax Post请求的响应。

    解决办法是:

    我通过post传递给视图的数据只是一个key/val对:“action=remove”。现在,我并没有在我的视图中使用这些数据。一旦我将数据分配给视图中的var(即foo=request.post['action']),视图将每次返回对Ajax请求的响应。

    绝对疯狂!

        6
  •  0
  •   loretoparisi    11 年前

    如果发生这种情况 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