我似乎得到了一个IOError:当我正在进行Ajax上传时,请求数据读取错误很多。例如,在每5个文件中上传它在至少3个时出错。
其他人似乎也有同样的问题。例如。
其他一些观察结果:
这绝对不是我的互联网连接或浏览器问题。似乎在所有浏览器chrome / FF / opera上都会发生。
我正在运行 django 1.1.1 Apache / 2.2.14(Ubuntu)mod_ssl / 2.2.14 OpenSSL / 0.9.8k mod_wsgi / 2.8 Python / 2.6.5 在Lucid。
它也不是文件大小。我有时可以上传1个MB以上的文件但是在180 Kb文件上失败。
回溯
Traceback (most recent call last):
File "/home/ubuntu/.virtualenvs/anonymous_app/lib/python2.6/site-packages/django/core/handlers/base.py", line 98, in get_response
response = middleware_method(request, e)
File "/home/ubuntu/.virtualenvs/anonymous_app/lib/python2.6/site-packages/django/core/handlers/base.py", line 92, in get_response
response = callback(request, *callback_args, **callback_kwargs)
File "/home/ubuntu/.virtualenvs/anonymous_app/lib/python2.6/site-packages/django/contrib/auth/decorators.py", line 78, in __call__
return self.view_func(request, *args, **kwargs)
File "/home/ubuntu/webapps/anonymous_app/app/do_work/views/__init__.py", line 391, in some_form_ajax_upload
f = request.FILES.get('file_upload')
File "/home/ubuntu/.virtualenvs/anonymous_app/lib/python2.6/site-packages/django/core/handlers/wsgi.py", line 187, in _get_files
self._load_post_and_files()
File "/home/ubuntu/.virtualenvs/anonymous_app/lib/python2.6/site-packages/django/core/handlers/wsgi.py", line 137, in _load_post_and_files
self._post, self._files = self.parse_file_upload(self.META, self.environ['wsgi.input'])
File "/home/ubuntu/.virtualenvs/anonymous_app/lib/python2.6/site-packages/django/http/__init__.py", line 124, in parse_file_upload
return parser.parse()
File "/home/ubuntu/.virtualenvs/anonymous_app/lib/python2.6/site-packages/django/http/multipartparser.py", line 133, in parse
for item_type, meta_data, field_stream in Parser(stream, self._boundary):
File "/home/ubuntu/.virtualenvs/anonymous_app/lib/python2.6/site-packages/django/http/multipartparser.py", line 606, in __iter__
for sub_stream in boundarystream:
File "/home/ubuntu/.virtualenvs/anonymous_app/lib/python2.6/site-packages/django/http/multipartparser.py", line 420, in next
return LazyStream(BoundaryIter(self._stream, self._boundary))
File "/home/ubuntu/.virtualenvs/anonymous_app/lib/python2.6/site-packages/django/http/multipartparser.py", line 446, in __init__
unused_char = self._stream.read(1)
File "/home/ubuntu/.virtualenvs/anonymous_app/lib/python2.6/site-packages/django/http/multipartparser.py", line 299, in read
out = ''.join(parts())
File "/home/ubuntu/.virtualenvs/anonymous_app/lib/python2.6/site-packages/django/http/multipartparser.py", line 292, in parts
chunk = self.next()
File "/home/ubuntu/.virtualenvs/anonymous_app/lib/python2.6/site-packages/django/http/multipartparser.py", line 314, in next
output = self._producer.next()
File "/home/ubuntu/.virtualenvs/anonymous_app/lib/python2.6/site-packages/django/http/multipartparser.py", line 375, in next
data = self.flo.read(self.chunk_size)
File "/home/ubuntu/.virtualenvs/anonymous_app/lib/python2.6/site-packages/django/http/multipartparser.py", line 405, in read
return self._file.read(num_bytes)
IOError: request data read error
<WSGIRequest
GET:<QueryDict: {}>,
POST:<could not parse>,
COOKIES:{'__utma': '168279989.1688771210.1285773436.1285773436.1285773436.1',
'__utmb': '168279989.20.10.1285773436',
'__utmc': '168279989',
'__utmz': '168279989.1285773436.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)',
'beta': 'True',
'sessionid': 'b1ecf92f2bba13e1885d07803e10aa03',
'timezone_offset': '-330'},
META:{'CONTENT_LENGTH': '188575',
'CONTENT_TYPE': 'multipart/form-data; boundary=---------------------------57602381214905740261171925981',
'DOCUMENT_ROOT': '/htdocs',
'GATEWAY_INTERFACE': 'CGI/1.1',
'HTTPS': '1',
'HTTP_ACCEPT': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'HTTP_ACCEPT_CHARSET': 'ISO-8859-1,utf-8;q=0.7,*;q=0.7',
'HTTP_ACCEPT_ENCODING': 'gzip,deflate',
'HTTP_ACCEPT_LANGUAGE': 'en-us,en;q=0.5',
'HTTP_CONNECTION': 'keep-alive',
'HTTP_COOKIE': 'beta=True; __utma=168279989.1688771210.1285773436.1285773436.1285773436.1; __utmb=168279989.20.10.1285773436; __utmc=168279989; __utmz=168279989.1285773436.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); sessionid=b1ecf92f2bba13e1885d07803e10aa03; timezone_offset=-330',
'HTTP_HOST': 'xxxxxx.compute-1.amazonaws.com',
'HTTP_KEEP_ALIVE': '115',
'HTTP_REFERER': 'https://ec2-184-72-79-96.compute-1.amazonaws.com/do-my-somees/enter/some-documents/',
'HTTP_USER_AGENT': 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.10) Gecko/20100915 Ubuntu/10.04 (lucid) Firefox/3.6.10',
'PATH': '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin',
'PATH_INFO': u'/do-my-somees/enter/some-documents/ajax-upload/Other-some-Document/',
'PATH_TRANSLATED': '/home/ubuntu/webapps/anonymous_app/settings/apache/qa.wsgi.py/do-my-somees/enter/some-documents/ajax-upload/Other-some-Document/',
'QUERY_STRING': '',
'REMOTE_ADDR': '',
'REMOTE_PORT': '15561',
'REQUEST_METHOD': 'POST',
'REQUEST_URI': '/do-my-somees/enter/some-documents/ajax-upload/Other-some-Document/',
'SCRIPT_FILENAME': '/home/ubuntu/webapps/anonymous_app/settings/apache/qa.wsgi.py',
'SCRIPT_NAME': u'',
'SERVER_ADDR': '10.196.142.182',
'SERVER_ADMIN': 'dev@anonymous_app.com',
'SERVER_NAME': 'ec2-184-72-79-96.compute-1.amazonaws.com',
'SERVER_PORT': '443',
'SERVER_PROTOCOL': 'HTTP/1.1',
'SERVER_SIGNATURE': '<address>Apache/2.2.14 (Ubuntu) Server at ec2-184-72-79-96.compute-1.amazonaws.com Port 443</address>\n',
'SERVER_SOFTWARE': 'Apache/2.2.14 (Ubuntu)',
'SSL_TLS_SNI': 'ec2-184-72-79-96.compute-1.amazonaws.com',
'mod_wsgi.application_group': 'qa.anonymous_app.com|',
'mod_wsgi.callable_object': 'application',
'mod_wsgi.listener_host': '',
'mod_wsgi.listener_port': '443',
'mod_wsgi.process_group': '',
'mod_wsgi.reload_mechanism': '0',
'mod_wsgi.script_reloading': '1',
'mod_wsgi.version': (2, 8),
'wsgi.errors': <mod_wsgi.Log object at 0xb9456860>,
'wsgi.file_wrapper': <built-in method file_wrapper of mod_wsgi.Adapter object at 0xb936a968>,
'wsgi.input': <mod_wsgi.Input object at 0xb9720e30>,
'wsgi.multiprocess': True,
'wsgi.multithread': False,
'wsgi.run_once': False,
'wsgi.url_scheme': 'https',
'wsgi.version': (1, 0)}>
答案 0 :(得分:13)
我也得到了这个例外。在Apache错误日志文件中,我看到了:
[Wed Aug 17 08:30:45 2011] [error] [client 10.114.48.206] (70014)End of file found: mod_wsgi (pid=9722): Unable to get bucket brigade for request., referer: https://egs-work/modwork/beleg/188074/edit/
[Wed Aug 17 08:30:45 2011] [error] [client 10.114.48.206] mod_wsgi (pid=3572): Exception occurred processing WSGI script '/home/modwork_egs_p/modwork_egs/apache/django_wsgi.py'.
[Wed Aug 17 08:30:45 2011] [error] [client 10.114.48.206] IOError: failed to write data
版本:
apache2-prefork-2.2.15-3.7.x86_64
apache2-mod_wsgi-3.3-1.8.x86_64 WSGIDaemonProcess with threads=1
mod_ssl/2.2.15
Linux egs-work 2.6.34.8-0.2-default #1 SMP 2011-04-06 18:11:26 +0200 x86_64 x86_64 x86_64 GNU/Linux
openSUSE 11.3 (x86_64)
首先我很困惑,因为最后一行“未能写数据”不适合django代码“加载发布数据”。但我想django想要向客户端写一个错误页面。但客户端已取消tcp连接。现在http 500页面无法写入客户端。
发送请求后,客户端在获得响应之前断开连接:
我只看过POST-Requests(不是GET)。如果使用POST,则Web服务器至少读取两次:首先获取标题,第二个获取数据。第二次读取失败。
很容易重现:
插入一些在第一次访问request.POST之前等待的代码(确保没有中间件在time.sleep()之前访问request.POST):
def edit(request):
import time
time.sleep(3)
#.....
现在做一个大的POST(例如文件上传)。我不知道apache缓冲区大小。但是5 MB就足够了。当浏览器显示沙漏时,浏览到其他页面。浏览器将取消请求,异常应该在日志文件中。
这是我的中间件,因为我不希望在我们的日志文件中获得上述回溯:
class HandleExceptionMiddleware:
def process_exception(self, request, exception):
if isinstance(exception, IOError) and 'request data read error' in unicode(exception):
logging.info('%s %s: %s: Request was canceled by the client.' % (
request.build_absolute_uri(), request.user, exception))
return HttpResponseServerError()
答案 1 :(得分:7)
请参阅https://groups.google.com/group/django-users/browse_thread/thread/946936f69c012d96
我自己有错误(但只有IE ajax请求,没有文件上传,只发布数据)。
如果我发现如何解决这个问题,将添加一个完整的答案。
答案 2 :(得分:5)
当内容类型标头错误地设置为application / json时,我们在上传到Django Rest Framework时看到了这个错误。帖子实际上是多部分表单数据。当我们删除了错误的内容类型标题时,错误就停止了。
答案 3 :(得分:4)
最近发生在我身上。我正在使用django-ajax-uploader,小文件上传成功,但是大文件,例如100MB在IOError: request data read error
之间打破了。
我检查了我的Apache配置,发现这些设置为RequestReadTimeout header=90 body=90
,这意味着Allow 90 seconds to receive the request including the headers and 90 seconds for receiving the request body
。
文件是在后端的块中接收的,这意味着如果文件大小很大,90
秒对于某些上传来说是不够的。那么如何确定请求的最佳值(秒)呢?
所以我使用了这个设置:
RequestReadTimeout header=90,MinRate=500 body=90,MinRate=500
定义MinRate
为我解决了问题。上述设置表明:
至少需要90秒才能收到请求正文。如果是客户 发送数据,每500字节增加超时1秒 接收
当客户端连续发送数据(ajax upload)时,如果收到数据,则自动增加超时是有意义的。有关RequestReadTimeout
的更多信息/变体可以找到here。
答案 4 :(得分:3)
从帖子中获取:Getting rid of Django IOErrors
通过@dlowe为Django 1.3扩展可能的解决方案,为了抑制IOError,我们可以将完整的工作示例写成:
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'filters': {
'supress_unreadable_post': {
'()': 'common.logging.SuppressUnreadablePost',
}
},
'handlers': {
'mail_admins': {
'level': 'ERROR',
'class': 'django.utils.log.AdminEmailHandler',
'filters': ['supress_unreadable_post'],
}
},
'loggers': {
'django.request': {
'handlers': ['mail_admins'],
'level': 'ERROR',
'propagate': True,
},
}
}
import sys, traceback
class SuppressUnreadablePost(object):
def filter(self, record):
_, exception, tb = sys.exc_info()
if isinstance(exception, IOError):
for _, _, function, _ in traceback.extract_tb(tb):
if function == '_get_raw_post_data':
return False
return True
答案 5 :(得分:0)
此问题已经开放了很长时间,并且与较低级别的库有关。我正在使用boto将文件上传到S3。我发现一个临时的权宜之计是添加一个10秒的显式HTTP套接字超时。之后我没有看到错误。您可以通过在服务器上创建boto配置来实现此目的:
#/etc/boto.cfg
[Boto]
http_socket_timeout=10
还要确保应用程序可以读取该文件。 请参阅我在google群组中的原始帖子:https://groups.google.com/forum/#!topic/boto-users/iWtvuECAcn4
答案 6 :(得分:0)
我在使用IE 10在Win8机器上验证我的网站时出现此错误。当我从IE测试文件上传时,上传被停留在1%,并且在+/- 1分钟后我收到服务器日志上的错误。我刚刚发现它是由TrendMicro补充引起的。一旦我禁用补充,上传就没有任何问题。