Python IOError:请求数据读取错误

Python IOError:请求数据读取错误,python,django,Python,Django,我似乎遇到了一个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 头脑清醒 它也不是文件大小。我有时可以上传

我似乎遇到了一个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 头脑清醒

  • 它也不是文件大小。我有时可以上传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)}>
回溯(最近一次呼叫最后一次):
文件“/home/ubuntu/.virtualenvs/anonymous_app/lib/python2.6/site packages/django/core/handlers/base.py”,第98行,在get_响应中
响应=中间件\方法(请求,e)
文件“/home/ubuntu/.virtualenvs/anonymous_app/lib/python2.6/site packages/django/core/handlers/base.py”,第92行,在get_响应中
响应=回调(请求,*回调参数,**回调参数)
文件“/home/ubuntu/.virtualenvs/anonymous\u app/lib/python2.6/site packages/django/contrib/auth/decorators.py”,第78行,在调用中__
返回self.view_func(请求,*args,**kwargs)
文件“/home/ubuntu/webapps/anonymous_app/app/do_work/views/_uinit_uuu.py”,第391行,以某种形式上传
f=request.FILES.get('file\u upload')
文件“/home/ubuntu/.virtualenvs/anonymous_app/lib/python2.6/site packages/django/core/handlers/wsgi.py”,第187行,在_get_文件中
self.\u加载\u发布和\u文件()
文件“/home/ubuntu/.virtualenvs/anonymous\u app/lib/python2.6/site packages/django/core/handlers/wsgi.py”,第137行,在_load\u post\u和_文件中
self.\u post,self.\u files=self.parse\u file\u upload(self.META,self.environ['wsgi.input']))
文件“/home/ubuntu/.virtualenvs/anonymous_app/lib/python2.6/site packages/django/http/_init__.py”,第124行,在parse_File_upload中
返回parser.parse()
文件“/home/ubuntu/.virtualenvs/anonymous_app/lib/python2.6/site packages/django/http/multipartparser.py”,第133行,在parse中
对于解析器中的项类型、元数据、字段流(流、自身边界):
文件“/home/ubuntu/.virtualenvs/anonymous_app/lib/python2.6/site packages/django/http/multipartparser.py”,第606行,在__
对于boundarystream中的sub_流:
文件“/home/ubuntu/.virtualenvs/anonymous_app/lib/python2.6/site packages/django/http/multipartparser.py”,下一页第420行
返回LazyStream(边界iter(self.\u-stream,self.\u-boundary))
文件“/home/ubuntu/.virtualenvs/anonymous_app/lib/python2.6/site packages/django/http/multipartparser.py”,第446行,在__
未使用的字符=self.\u stream.read(1)
文件“/home/ubuntu/.virtualenvs/anonymous_app/lib/python2.6/site packages/django/http/multipartparser.py”,第299行,已读
out=''.join(parts())
文件“/home/ubuntu/.virtualenvs/anonymous_app/lib/python2.6/site packages/django/http/multipartparser.py”,第292行,部分
chunk=self.next()
文件“/home/ubuntu/.virtualenvs/anonymous_app/lib/python2.6/site packages/django/http/multipartparser.py”,下一页第314行
输出=self.\u producer.next()
文件“/home/ubuntu/.virtualenvs/anonymous_app/lib/python2.6/site packages/django/http/multipartparser.py”,下一页第375行
数据=self.flo.read(self.chunk\u大小)
文件“/home/ubuntu/.virtualenvs/anonymous_app/lib/python2.6/site packages/django/http/multipartparser.py”,第405行,已读
返回self.\u file.read(num\u字节)
IOError:请求数据读取错误

正如您所想,这不是django错误

我自己也有这个错误(但是IE只支持ajax请求,不支持文件上传,只支持发布数据)


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

这个问题已经公开很长时间了,与较低级别的库有关。我使用boto将文件上传到S3。我发现一个临时的权宜之计是添加一个10秒的显式HTTP套接字超时。从那以后我就没有看到错误了。您可以通过在服务器上创建boto配置来实现这一点:

#/etc/boto.cfg 
[Boto]
http_socket_timeout=10
还要确保应用程序可以读取该文件。
请参阅我在google group上的原始帖子:

我也遇到了这个例外。在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代码“加载post数据”。但是我猜django想给客户端写一个错误页面。但客户端已取消tcp连接。现在http 500页面无法写入客户端

客户端在发送请求后和收到响应之前断开连接:

  • 用户关闭浏览器或导航到其他页面
  • 用户按下了重新加载按钮
我只在POST请求(而不是GET)中看到过这一点。如果使用POST,Web服务器至少读取两次:第一次读取头,第二次读取数据。第二次读取失败

很容易复制:

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

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

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

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

从线程中获取以下信息:

通过@dlowe for Django 1.3扩展可能的解决方案,为了抑制所关注的IOError,我们可以编写完整的工作示例,如下所示:

设置.py common/logging.py
当内容类型头被错误地设置为application/json时,我们在上传到Django Rest框架时看到了这个错误。该职位被任命为act
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()
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
RequestReadTimeout header=90,MinRate=500 body=90,MinRate=500