42 votes

IOError: erreur de lecture des données de la demande

J'ai l'impression de recevoir un IOError: demande de lecture de données d'erreur beaucoup quand je fais une requête Ajax upload. Par exemple toutes les 5 fichier télécharge les erreurs sur atleast 3.

D'autres personnes semblent avoir eu le même problème. Par exemple.

Quelques autres observations:

  • Ce n'est certainement pas de ma connexion internet ou d'un problème de navigateur. Semble être le cas sur tous les navigateurs chrome/FF/opera.

  • Je suis en cours d'exécution django 1.1.1 Apache/2.2.14 (Ubuntu) mod_ssl/2.2.14 OpenSSL/0.9.8 k mod_wsgi/2.8 Python/2.6.5 sur Lucid.

  • Il n'est également pas la taille du fichier. Je peux parfois de téléchargement 1+ MO de fichiers, mais ne parviennent pas à 180 Ko des fichiers.


Traceback

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

13voto

guettli Points 3284

Je bénéficier de cette exception. Dans Apache error log, je vois ceci:

[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

Versions:

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)

J'ai d'abord été confus, parce que la dernière ligne "impossible d' écrire les données" ne correspond pas à la django code "charger les données de postes". Mais je suppose que django veut écrire une page d'erreur au client. Mais le client a annulé la connexion tcp. Et maintenant, http 500 pages ne peuvent pas être écrits pour le client.

Le client déconnecté après l'envoi de la demande, et avant d'obtenir la réponse:

  • L'utilisateur a fermé le navigateur ou de naviguer vers une autre page.
  • L'utilisateur a appuyé sur le bouton recharger.

J'ai vu qu'avec POST-Demandes (pas OBTENIR). Si le POST est utilisé, le serveur web n'a lu au moins deux fois: d'Abord à obtenir les en-têtes, le second pour obtenir les données. Le deuxième échec de lecture.

Il est facile à reproduire:

Insérer un bout de code qui attend avant le premier accès à la demande.POST arrive (assurez-vous qu'aucun middleware accède à la demande.POST avant le temps.sleep()):

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

Maintenant faire un gros POST (ex: téléchargement de fichier). Je ne sais pas apache taille de la mémoire tampon. Mais 5 MO devrait être suffisant. Lorsque le navigateur affiche le sablier, accédez à une autre page. Le navigateur va annuler la demande et de l'exception doit être dans le fichier de log.

C'est mon Middleware, car je ne veux pas obtenir au-dessus de la traçabilité en amont dans nos fichiers de log:

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

7voto

klemens Points 611

comme vous pouvez le penser, ce n'est pas une erreur de Django.

voir https://groups.google.com/group/django-users/browse_thread/thread/946936f69c012d96.

J'ai moi-même l'erreur (mais seulement pour les demandes IE dans ajax, pas de téléchargement de fichier, juste des données).

ajoutera une réponse complète si jamais je découvre comment résoudre ce problème.

5voto

user2275915 Points 31

Nous constations cette erreur lors des téléchargements vers Django Rest Framework lorsque l'en-tête de type de contenu était incorrectement défini sur application / json. Le message était en réalité une fiche de données en plusieurs parties. Les erreurs se sont arrêtées lorsque nous avons supprimé l'en-tête de type de contenu incorrect.

5voto

Aamir Adnan Points 10903

Ce qui m'est arrivé récemment. J'ai été en utilisant django-ajax-uploader et de petits fichiers ont le téléchargement réussi, mais de gros fichiers par exemple de 100 mo ont été la rupture entre les deux, avec IOError: request data read error.

J'ai vérifié ma configuration d'Apache et trouvé ces paramètre RequestReadTimeout header=90 body=90 ce qui signifie Allow 90 seconds to receive the request including the headers and 90 seconds for receiving the request body.

Le fichier est reçu en morceaux au backend, ce qui signifie que si la taille du fichier est grande, 90 les secondes ne sont pas assez pour certains téléchargements. Alors, comment déterminer la meilleure valeur (en secondes) pour les demandes?

J'ai donc utilisé ce paramètre:

RequestReadTimeout header=90,MinRate=500 body=90,MinRate=500

La définition de l' MinRate résout le problème pour moi. Le réglage ci-dessus stipule que:

Permettre au moins de 90 secondes pour recevoir le corps de la requête. Si le client envoie des données, augmenter le délai d'attente de 1 seconde pour chaque tranche de 500 octets reçu

Comme le client envoie des données en continu (ajax upload) il est logique d'augmenter automatiquement le délai d'attente si les données sont reçues. Plus d'informations/variations sur l' RequestReadTimeout peut être trouvé ici.

3voto

Prendre ceci du fil: Se débarrasser de Django IOErrors

En étendant la solution possible de @dlowe pour Django 1.3, afin de supprimer le problème IOError, nous pouvons écrire l’exemple de travail complet sous la forme:

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

common / 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
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X