2009-01-04 11 views
8

Estoy intentando portar mi primera aplicación Django 1.0.2 para ejecutar en OSX/Leopard con Apache + mod_python 3.3.1 + python 2.6.1 (todos ejecutando en modo de 64 bits) y estoy experimentando un error ocasional al cargar un archivo que no estaba presente al probar con el servidor de desarrollo de Django.Carga de archivos Django ocasionalmente fallando

El código para la carga es similar al que se describe en la documentación de Django:

class UploadFileForm(forms.Form): 
    file = forms.FileField() 
    description = forms.CharField(max_length=100) 
    notifygroup = forms.BooleanField(label='Notify Group?', required=False) 

def upload_file(request, date, meetingid): 
    print date, meetingid 
    if request.method == 'POST': 
     print 'before reloading the form...' 
     form = UploadFileForm(request.POST, request.FILES) 
    print 'after reloading the form' 
     if form.is_valid(): 
      try: 
       handle_uploaded_file(request.FILES['file'], request.REQUEST['date'], request.REQUEST['description'], form.cleaned_data['notifygroup'], meetingid) 
      except: 
       return render_to_response('uploaded.html', { 'message': 'Error! File not uploaded!' }) 
      return HttpResponseRedirect('/myapp/uploaded/') 
    else: 
     form = UploadFileForm() 
    return render_to_response('upload.html', {'form': form, 'date':date, 'meetingid':meetingid}) 

Este código normalmente funciona correctamente, pero a veces (por ejemplo, una vez cada 10 cargas) y después de un tiempo bastante largo de espera, falla con el siguiente error:

IOError at /myapp/upload/2009-01-03/1 
Client read error (Timeout?) 
Request Method: POST 
Request URL: http://192.168.0.164/myapp/upload/2009-01-03/1 
Exception Type: IOError 
Exception Value:  
Client read error (Timeout?) 
Exception Location: /Library/Frameworks/Python64.framework/Versions/2.6/lib/python2.6/site-packages/django/http/multipartparser.py in read, line 406 
Python Executable: /usr/sbin/httpd 
Python Version: 2.6.1 
Python Path: ['/djangoapps/myapp/', '/djangoapps/', '/Library/Frameworks/Python64.framework/Versions/2.6/lib/python26.zip', '/Library/Frameworks/Python64.framework/Versions/2.6/lib/python2.6', '/Library/Frameworks/Python64.framework/Versions/2.6/lib/python2.6/plat-darwin', '/Library/Frameworks/Python64.framework/Versions/2.6/lib/python2.6/plat-mac', '/Library/Frameworks/Python64.framework/Versions/2.6/lib/python2.6/plat-mac/lib-scriptpackages', '/Library/Frameworks/Python64.framework/Versions/2.6/lib/python2.6/lib-tk', '/Library/Frameworks/Python64.framework/Versions/2.6/lib/python2.6/lib-old', '/Library/Frameworks/Python64.framework/Versions/2.6/lib/python2.6/lib-dynload', '/Library/Frameworks/Python64.framework/Versions/2.6/lib/python2.6/site-packages'] 
Server time: Sun, 4 Jan 2009 22:42:04 +0100 

Environment: 

Request Method: POST 
Request URL: http://192.168.0.164/myapp/upload/2009-01-03/1 
Django Version: 1.0.2 final 
Python Version: 2.6.1 
Installed Applications: 
['django.contrib.auth', 
'django.contrib.contenttypes', 
'django.contrib.sessions', 
'django.contrib.sites', 
'django.contrib.admin', 
'myapp.application1'] 
Installed Middleware: 
('django.middleware.common.CommonMiddleware', 
'django.contrib.sessions.middleware.SessionMiddleware', 
'django.contrib.auth.middleware.AuthenticationMiddleware') 

Traceback: 
File "/Library/Frameworks/Python64.framework/Versions/2.6/lib/python2.6/site-packages/django/core/handlers/base.py" in get_response 
    86.     response = callback(request, *callback_args, **callback_kwargs) 
File "/djangoapps/myapp/../myapp/application1/views.py" in upload_file 
    137.   form = UploadFileForm(request.POST, request.FILES) 
File "/Library/Frameworks/Python64.framework/Versions/2.6/lib/python2.6/site-packages/django/core/handlers/modpython.py" in _get_post 
    113.    self._load_post_and_files() 
File "/Library/Frameworks/Python64.framework/Versions/2.6/lib/python2.6/site-packages/django/core/handlers/modpython.py" in _load_post_and_files 
    87.     self._post, self._files = self.parse_file_upload(self.META, self._req) 
File "/Library/Frameworks/Python64.framework/Versions/2.6/lib/python2.6/site-packages/django/http/__init__.py" in parse_file_upload 
    124.   return parser.parse() 
File "/Library/Frameworks/Python64.framework/Versions/2.6/lib/python2.6/site-packages/django/http/multipartparser.py" in parse 
    134.    for item_type, meta_data, field_stream in Parser(stream, self._boundary): 
File "/Library/Frameworks/Python64.framework/Versions/2.6/lib/python2.6/site-packages/django/http/multipartparser.py" in __iter__ 
    607.   for sub_stream in boundarystream: 
File "/Library/Frameworks/Python64.framework/Versions/2.6/lib/python2.6/site-packages/django/http/multipartparser.py" in next 
    421.    return LazyStream(BoundaryIter(self._stream, self._boundary)) 
File "/Library/Frameworks/Python64.framework/Versions/2.6/lib/python2.6/site-packages/django/http/multipartparser.py" in __init__ 
    447.   unused_char = self._stream.read(1) 
File "/Library/Frameworks/Python64.framework/Versions/2.6/lib/python2.6/site-packages/django/http/multipartparser.py" in read 
    300.   out = ''.join(parts()) 
File "/Library/Frameworks/Python64.framework/Versions/2.6/lib/python2.6/site-packages/django/http/multipartparser.py" in parts 
    293.     chunk = self.next() 
File "/Library/Frameworks/Python64.framework/Versions/2.6/lib/python2.6/site-packages/django/http/multipartparser.py" in next 
    315.    output = self._producer.next() 
File "/Library/Frameworks/Python64.framework/Versions/2.6/lib/python2.6/site-packages/django/http/multipartparser.py" in next 
    376.    data = self.flo.read(self.chunk_size) 
File "/Library/Frameworks/Python64.framework/Versions/2.6/lib/python2.6/site-packages/django/http/multipartparser.py" in read 
    406.   return self._file.read(num_bytes) 

Exception Type: IOError at /myapp/upload/2009-01-03/1 
Exception Value: Client read error (Timeout?) 

Traté de ejecutar todo utilizando mod_wsgi y no hay diferencia.

¿Alguien sabe qué estoy haciendo mal?

Gracias de antemano por su ayuda!

OPPD

=====

Actualizado:

Aunque he conseguido subir archivos de gran tamaño (60 + MB), cuando no se produce un error sin relación evidente con el tamaño de la cargar, es decir, falla también con archivos de 10kB que se cargaron con anterioridad.

Respuesta

0

¿Qué tan grande es el archivo? Puede llevar suficiente tiempo cargar el script de carga, así que intente aumentar el tiempo de ejecución para ese script.

+0

Lo siento, no es eso: puedo cargar archivos grandes y todavía falla con los pequeños.Ver pregunta actualizada Gracias de cualquier manera. –

1

Me perseguir el valor de la excepción

Client read error (Timeout?) 

esto parece bastante extraño. Intente leer this thread

8

El uso de mod_wsgi hizo que el problema desapareciera para Firefox.

Al limitar mi investigación a un problema de interacción entre Apache y Safari, me encontré con este informe de error para Apache https://bugs.webkit.org/show_bug.cgi?id=5760 que describe algo muy similar a lo que está sucediendo y aparentemente todavía está abierto. La lectura de esto me dio la idea de intentar desactivar el keepalive y, aunque necesito probarlo más extensamente, parece que el problema se ha ido.

Una simple:

BrowserMatch "Safari" nokeepalive

en la configuración de Apache hizo el truco.

+0

Recibí esta excepción con estos datos. 'HTTP_USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)', – Oduvan

0

Mucho tiempo sin respuesta aquí, pero después de haberlo experimentado e intenté algunas cosas para resolverlo. Parece que en mi caso sucedió si alguien canceló una descarga (o perdió una conexión) durante una carga.

Puede probar esto usted mismo para ver si esto es lo que está causando el "IOError: solicitar error de lectura de datos": cargue un archivo lo suficientemente grande como para desconectar su cable ethernet de su computadora o enrutador. Espere un poco y vea si obtiene el error. Lo hago cada vez!

Cuestiones relacionadas