我有一个使用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
出现在我服务器的错误日志中。
我可以通过不明确关闭连接来“修复”应用程序中的问题,但只是让它完成下载并忽略结果。但是,如果可能的话,我想在服务器端修复此问题。我该怎么办?
答案 0 :(得分:6)
[免责声明:这是“为什么它不能轻易完成”的解释,而非解决方案]
正如@Slott指出的那样,在封闭套接字上调用stream.close
或stream.write
时,这绝对是技术上正确的行为。但是,我理解问题的动机......在wsgi应用程序的上下文中,客户端在完全或部分读取后终止连接不是“特殊”行为,它始终发生。因为它未被处理会留下令人意想不到的印象/代码对此毫无准备,实际上它是预期的,并且不应该值得注意。所以修好会很好。
问题在于你必须找到区分案件的方法......
像“客户端读取'状态:304',然后关闭连接”或“客户端读取所有字节,然后关闭连接,即使它已经请求连接应该被重用”的情况“是它将是它的地方适合在log.debug()
调用之外不发出任何类型的日志记录。
但是“客户端在文件中间停止读取的情况,因为当ISP路由器中断时连接已经死亡” 值得记录错误。有些东西没有成功完成,应该回滚服务器应用程序构建的任何事务状态。在这种情况下IOError
向上传播是正确的做法。
如果在每个地方都可以提出这些错误,那么这些错误只能是可以保持的,修改代码以区分这两种情况。在那之前,wsgi的作者似乎在谨慎方面犯了错误。因此,我所知道的并没有快速解决这个问题。
(另外,我应该注意这不是django特有的,我使用paste + pylons并且发生同样的事情)
答案 1 :(得分:1)
请参阅:http://code.google.com/p/modwsgi/issues/detail?id=29
如果处理可迭代,则消息记录调试级别而不是 使用Python异常。从而看到客户端关闭连接问题 当使用iterable时,需要LogLevel进行调试。
显然,您需要将Django响应调整为可迭代而不是字符串。