编程语言
首页 > 编程语言> > python – 当客户端关闭与Django / WSGI应用程序的连接时,如何防止“IOError:写入数据失败”?

python – 当客户端关闭与Django / WSGI应用程序的连接时,如何防止“IOError:写入数据失败”?

作者:互联网

我有一个使用Python实现的Web服务的iPhone应用程序,使用Django和Piston,通过WSGI在Apache服务器上运行.

有时,应用会在呼叫结束前关闭与服务器的连接.当它这样做时,它会导致:

[Tue Sep 06 11:29:46 2011] [error] [client 207.35.164.99] mod_wsgi (pid=820): Exception occurred processing WSGI script 'myscript.wsgi'.
[Tue Sep 06 11:29:46 2011] [error] [client 207.35.164.99] IOError: failed to write data

出现在我服务器的错误日志中.

我可以通过不明确关闭连接来“修复”应用程序中的问题,但只是让它完成下载并忽略结果.但是,如果可能的话,我想在服务器端修复此问题.我该怎么做?

解决方法:

[免责声明:这是“为什么它不能轻易完成”的解释,而不是解决方案]

正如@Slott指出的那样,在封闭的套接字上调用stream.close或stream.write时,这绝对是技术上正确的行为.但是,我理解问题的动机……在wsgi应用程序的上下文中,客户端在完全或部分读取后终止连接不是“特殊”行为,它始终发生.因为它未被处理会留下令人意想不到的印象/代码对此毫无准备,实际上它是预期的,并且不应该值得注意.所以修好会很好.

问题是你必须找到区分案件的方法……

>像“客户端读取’状态:304′,然后关闭连接”或“客户端读取所有字节,然后关闭连接,即使它已经请求连接应该被重用”的情况“是适合不发出任何除了log.debug()调用之外的那种日志记录.
>但是“客户端在文件中间停止读取因为ISP路由器中断时连接已经死亡”这样的情况值得记录错误.有些东西没有成功完成,应该回滚服务器应用程序构建的任何事务状态.在这种情况下,IOError向上传播是正确的做法.

如果在每个地方都可以提出这些错误,那么这些错误只能是可以修改的,修改代码以区分这两种情况.在那之前,wsgi的作者似乎在谨慎方面犯了错误.因此,我所知道的并没有快速解决这个问题.

(另外,我应该注意这不是django特有的,我使用粘贴塔并且发生同样的事情)

标签:python,apache,django,mod-wsgi,django-piston
来源: https://codeday.me/bug/20190613/1235964.html