django 中断管错误的可疑解决方案

Dubious solution for broken pipe error in django

本文关键字:解决方案 错误 中断 django      更新时间:2023-09-26

在我的 django 应用程序中,我在极少数情况下在 Ajax 例程中调用location.reload();。这在Chrome上效果很好,但是在Firefox4中,我在开发服务器上(Django 1.2.5,Python 2.7)上得到了两次error: [Errno 32] Broken pipe,这大约需要10秒。
而且该错误似乎吃掉了我尝试使用 django 消息框架显示的消息。

不,我把这一行换成了

var uri = location.href;
location.href = uri;

现在重新加载仍然需要大约 10 秒,但 Firefox 会显示该消息。

到目前为止,它有效。但对我来说,这看起来像是一个肮脏的黑客。所以我的问题是:

  1. 任何人都可以首先解释(或猜测)错误是什么吗?
  2. 您是否看到将来这个"解决方案"可能会咬我的任何问题?

(注意:我不是第一个遇到这个问题的人)。

首先,这是某些特定浏览器的问题(并且可能在服务器端进行长时间处理),而不是 django 的问题。

来自 django 上的错误报告:

这是常见的错误,每当浏览器关闭连接而开发服务器仍在忙于发送数据时都会发生此错误。我们能做的最好的事情就是有一个更明确的错误消息。

它实际上可以发生在其他系统上,例如来自樱桃

没有什么可担心的,因为这只意味着客户端在服务器之前关闭了连接。在此回溯之后,您的 CherryPy 服务器仍将保持正常运行。

这是对你第一个问题的介绍:

  1. 任何人都可以首先解释(或猜测)错误是什么吗?

好吧,这只是浏览器关闭连接 - 一种客户端超时。这个 Django + WebKit = Broken pipe 答案确实回答了这个问题。

为什么它通过更改location.href而不是使用location.reload()来工作?好吧,我猜,但这只是一个猜测,Firefox的行为略有不同,重新加载会以不同的方式超时。

我认为该消息已被消耗,因为当浏览器拉动触发器并关闭连接时,请求已经发送

开发服务器是单线程的,这也可能是问题的一个因素。

我通常在真正的(本地)服务器上进行开发(nginx+apache+mod_wsgi,没什么花哨的) - 避免遇到在生产中永远不会发生的愚蠢问题。

  1. 您是否看到将来这个"解决方案"可能会咬我的任何问题?

好吧,它可能不适用于在重新加载之前检查href是否已更改的浏览器。或者它可能会命中缓存而不是执行真正的请求(您可以使用 reload() 强制避免缓存)。并且行为可能并非在所有浏览器上都一致。但同样,你已经遇到了浏览器的怪癖,所以我不会太担心它本身。

顺便说一下,你可以简单地做:

location.href = location.href

我宁愿担心处理需要 10 秒!这真的不应该发生。编辑所以看起来是浏览器本身引发了漫长的处理时间和损坏的管道错误。对我来说,听起来像是单线程 Django 服务器上的(糟糕的)并行请求。结束了

在真实的Web服务器上进行测试,优化您的代码;如果这还不够,请使用Celery+Rabbitmq在后台进程上启动长任务;无论如何,不要在一个不是真正问题的问题上浪费时间!

您可能能够忍受location.reload()和一些调整,或者可能只是一个真正的测试环境!

断开管道错误也可能归结为 Django 调试服务器中缺乏对某些功能的支持 - 一个值得注意的问题是 Django 缺乏对 Range HTTP 请求的支持(有关详细信息,请参阅此处:Django 中的字节范围),这些请求在交付 [流] 媒体内容时常用

使用数据包捕获程序(如Wireshark)调查实际的HTTP交换可能是值得的,这样您就可以看到问题发生的位置和时间。