【问题标题】:Django + WebKit = Broken pipeDjango + WebKit = 断管
【发布时间】:2011-02-21 12:31:49
【问题描述】:

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

谁能帮帮我?我要疯了!

【问题讨论】:

  • 运行请求的视图需要多长时间?
  • 第一次很快,但是在我得到了破管道错误之后,下一页加载需要大约 10-15 秒才能完成:S

标签: django webkit broken-pipe


【解决方案1】:

如果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

【讨论】:

  • @jmagnusson 对,我在使用 javascript 客户端时遇到了同样的问题,这就是原因。然后在答案中解释!
  • 谢谢!这正是导致 Chrome 出现问题的原因。 Firefox 会很好地理解它。点赞!
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    这可能是由于调度 ajax 调用的 javascript 函数出现错误。

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

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

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

    【讨论】:

    • 谢谢!我刚刚花了一个小时弄清楚我需要在我的 jquery ajax 中“返回 False”。 POST 只需要它,因此这次让我失望了……
    【解决方案4】:

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

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

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

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

    【讨论】:

      【解决方案5】:

      我遇到了一个可能相关的问题。

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

      解决办法是这样的:

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

      绝对疯了!

      【讨论】:

        【解决方案6】:

        这不是 Django 问题。您的浏览器很可能出现错误。

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

        查看this Django ticket了解更多信息。

        【讨论】:

        • 我在使用 django 开发服务器(1.3 pre-alpha)时遇到了这个问题,这个答案是正确的,因为 django 没有问题(浏览器是 Chrome/Safari)。我能够通过将我的 ajax 请求作为 POST 而不是 GET 来解决问题。如果 ajax 请求是通过 GET 发出的,由于某种原因,两个浏览器都没有等待响应。
        • 正确! @loretoparisi 的回答给出了导致这种行为的原因。
        猜你喜欢
        • 2014-08-09
        • 1970-01-01
        • 1970-01-01
        • 2011-12-23
        • 2022-10-18
        • 2016-11-07
        • 2013-10-17
        • 2017-11-23
        • 2013-10-28
        相关资源
        最近更新 更多