为什么mod_wsgi无法写入数据?IOError:无法写入数据。

43

这个错误是由什么引起的:

$ sudo tail -n 100 /var/log/apache2/error.log'

[Wed Dec 29 15:20:03 2010] [error] [client 220.181.108.181] mod_wsgi (pid=20343): Exception occurred processing WSGI script '/home/username/public_html/idm.wsgi'.  
[Wed Dec 29 15:20:03 2010] [error] [client 220.181.108.181] IOError: failed to write data  

这里是 WSGI 脚本:

$ cat public_html/idm.wsgi 
import os
import sys

sys.path.append('/home/username/public_html/IDM_app/')

os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'

import django.core.handlers.wsgi

application = django.core.handlers.wsgi.WSGIHandler()

Django为什么无法写入数据?

我正在运行Django 1.2.4版本。


Related:https://dev59.com/questions/T-o6XIcBkEYKwwoYTS5D#7089413 - guettli
4个回答

31

如果出现错误,没有任何Python回溯信息,可能是以下问题的变体:

http://code.google.com/p/modwsgi/issues/detail?id=29&can=1

即在Web服务器未能写回完整响应之前,HTTP客户端连接已经丢失。它可以表现为Apache错误日志中仅出现“客户端关闭连接”、“无法写入数据”或“无法刷新数据”的IOError。即不会由WSGI应用程序看到,因为数据的写入发生在WSGI应用程序返回后,因此无法将异常抛回到应用程序中以执行任何操作。

问题是,如果您配置了将错误发送到电子邮件,则是否会从Django收到错误消息。如果是这样,那么问题实际上是出现在Django中。


但是如何解决呢?在我的应用程序中,似乎与发送邮件有关(这需要很长时间)... - gabn88
1
在别人的问题跟进中添加一个模糊的问题并没有什么意义,而且也没有提供任何关于你情况的具体信息。你的情况可能完全不同。创建一个新问题,详细解释你的问题。 - Graham Dumpleton
很抱歉,但我遇到了相同的错误,并且我已经配置了Django发送电子邮件,但是没有收到任何邮件。在我的情况下,问题是我更改了smtp邮箱密码,但没有在Django中进行更改。这可能会帮助未来搜索与我相同问题的人...并无恶意! - gabn88

6
我在一个使用大量AJAX调用的应用程序中遇到了同样的问题(mod_wsgi 3.3)。有没有已知的解决方案?我考虑忽略异常,但这通常不是一个很好的主意。
更新
实际上,这可能是由于几种原因造成的,但最可能的原因是您正在使用“write”回调而不是“yield”输出。
我相信这会有所帮助:

http://groups.google.com/group/modwsgi/browse_thread/thread/c9cc1307bc10cfff


1
无论是使用write还是yield,都会发生这种情况。Django不仅使用write,也使用yield。如果使用write,则错误将传播回WSGI应用程序,并且该应用程序可能会捕获它并将其转换为500,而不记录它。对于yield,是mod_wsgi写入数据,无法将错误传播回应用程序,因此mod_wsgi记录没有回溯的错误,因为它不在应用程序的上下文中。 - Graham Dumpleton

0

我在Digital Ocean上的Python Web应用程序中遇到了同样的问题,经过认真检查日志文件后,我发现这是我的数据库mysql的问题!

问题是由于我运行的存储空间(RAM)不足导致的。

所以,请查看以下问题并解决问题!

`关于Mysql的问题

还有这个

希望能帮到你


-5
我猜测这是一个权限问题。先让目标目录/文件可被任何人写入,然后把该文件的所有者设置为你的www-data组(或者你的apache用户),并确保该文件夹中没有敏感信息,否则可能会存在安全隐患。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接