IOError:请求数据读取错误

我似乎得到一个IOError:请求数据读取错误,当我正在做一个Ajax上传。 例如,每5个文件中至less有3个上传错误。

其他人似乎也有同样的问题。 例如。

  • Django上传失败的请求数据读取错误
  • Djangofile upload偶尔失败

其他一些观察:

  • 这绝对不是我的互联网连接或浏览器问题。 似乎在所有的浏览器铬/ FF /歌剧发生。

  • 我正在运行django 1.1.1 Apache / 2.2.14(Ubuntu)mod_ssl / 2.2.14关于Lucid的OpenSSL / 0.9.8k mod_wsgi / 2.8 Python / 2.6.5

  • 这也不是文件大小。 我有时可以上传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)}> 

我也得到这个例外。 在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页面不能写入客户端。

客户端在发送请求之后断开,在得到响应之前:

  • 用户closures浏览器或导航到其他页面。
  • 用户按下了重新加载button。

我只看到这与POST请求(不GET)。 如果使用POST,则Web服务器至less读取两次:首先获取标题,第二次获取数据。 第二次读取失败。

很容易重现:

插入一些在第一次访问请求之前等待的代码。POST发生(确保没有中间件在time.sleep()之前访问request.POST):

 def edit(request): import time time.sleep(3) #..... 

现在做一个大的POST(例如file upload)。 我不知道Apache的缓冲区大小。 但是5 MB应该足够了。 当浏览器显示沙漏时,浏览到其他页面。 浏览器将取消请求,exception应该在日志文件中。

这是我的中间件,因为我不想在我们的日志文件中得到上面的回溯:

 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() 

如你所想,这不是Django的错误。

请参阅https://groups.google.com/group/django-users/browse_thread/thread/946936f69c012d96

有我自己的错误(但IE浏览器ajax请求只,没有file upload,只是发布数据)。

将添加一个完整的答案,如果我find如何解决这个问题。

当内容types头部被错误地设置为application / json时,我们看到上传到Django Rest Framework的这个错误。 该职位实际上是多部分forms的数据。 当我们删除不正确的内容types标题时,错误停止。

最近发生在我身上。 我正在使用django-ajax-uploader ,小文件正在成功上传,但大文件,例如100MB与IOError: request data read error

我检查了我的Apacheconfiguration,发现这些设置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为我解决了这个问题。 以上设置说明:

允许至less90秒接收请求主体。 如果客户端发送数据,则每接收500个字节,超时时间增加1秒

由于客户端连续发送数据(ajax上传),如果收到数据,自动增加超时是有意义的。 有关RequestReadTimeout更多信息/变体可以在这里find。

从线程采取: 摆脱Django IOErrors

通过@Dlowe为Django 1.3扩展可能的解决scheme,为了抑制IOError,我们可以编写完整的工作示例:

settings.py

 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, }, } } 

通用/ logging.py

 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 

我在IE8的Win8机器上validation了我的网站时出现了这个错误。当我从IE浏览器上传文件时,上传被阻塞了1%,在+/- 1分钟之后,我得到了服务器日志上的错误。 我刚发现这是TrendMicro的补充。 一旦我禁用补码,发生上传没有任何问题。

这个问题已经开放很长时间了,与下级图书馆有关。 我正在使用boto上传文件到S3。 我发现一个临时的权宜之计是添加一个明确的HTTP套接字超时10秒。 之后我还没有看到这个错误。 你可以通过在服务器上创build一个botoconfiguration来实现:

 #/etc/boto.cfg [Boto] http_socket_timeout=10 

还要确保该文件可以被应用程序读取。 查看我在谷歌组的原文: https : //groups.google.com/forum/#!topic/ boto-users/ iWtvuECAcn4