Иногда не удается загрузить файл Django - PullRequest
8 голосов
/ 05 января 2009

Я пытаюсь перенести свое первое приложение Django 1.0.2 для запуска на OSX / Leopard с Apache + mod_python 3.3.1 + python 2.6.1 (все работают в 64-битном режиме), и иногда возникают ошибки, когда загрузка файла, которого не было при тестировании на сервере разработки Django.

Код для загрузки похож на тот, который описан в документации 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})

Этот код обычно работает правильно, но иногда (скажем, один раз каждые 10 загрузок) и после довольно длительного времени ожидания происходит сбой со следующей ошибкой:

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

Я пытался запустить все, используя mod_wsgi, и без разницы.

Кто-нибудь знает, что я делаю не так?

Заранее спасибо за помощь!

ppdo

=====

Обновлен:

Несмотря на то, что мне удалось загрузить большие файлы (более 60 МБ), при сбое происходит сбой без очевидной связи с размером загрузки, т. Е. Происходит сбой и с файлами размером 10 КБ, которые были успешно загружены ранее.

Ответы [ 4 ]

8 голосов
/ 06 января 2009

Использование mod_wsgi помогло решить проблему с Firefox.

Ограничив свое исследование проблемой взаимодействия между Apache и Safari, я наткнулся на этот отчет об ошибке для Apache https://bugs.webkit.org/show_bug.cgi?id=5760, в котором описывается нечто очень похожее на происходящее, и оно, очевидно, все еще открыто. Прочтение этого дало мне идею попытаться отключить keepalive, и, хотя мне нужно более тщательно его протестировать, похоже, проблема исчезла.

Простое:

BrowserMatch "Safari" nokeepalive

в конфигурации Apache добился цели.

1 голос
/ 05 января 2009

Я бы погнался за значением исключения

Client read error (Timeout?)

это кажется достаточно странным. Попробуйте прочитать эту тему

0 голосов
/ 17 марта 2010

Давно не отвечал здесь, но испытал это сам и попробовал несколько вещей, чтобы решить это. Кажется, в моем случае это произошло, если кто-то отменил загрузку (или потерял соединение) во время загрузки.

Вы можете попробовать это сами, чтобы увидеть, является ли это причиной того, что «IOError: ошибка чтения данных запроса» для вас: загрузите достаточно большой файл, чтобы вы могли отключить кабель Ethernet от компьютера или маршрутизатора. Подождите немного и посмотрите, получите ли вы ошибку. Я делаю каждый раз!

0 голосов
/ 05 января 2009

Насколько велик файл? Время загрузки сценария загрузки может занять достаточно много времени, поэтому попробуйте увеличить время выполнения этого сценария.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...