Я пытаюсь перенести свое первое приложение 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 КБ, которые были успешно загружены ранее.






Насколько велик файл? Загрузка может занять достаточно много времени, чтобы время ожидания сценария загрузки истекло, поэтому попробуйте увеличить время выполнения этого сценария.
Я бы погнался за значением исключения
Client read error (Timeout?)
это кажется достаточно странным. Попробуйте прочитать эта ветка
Использование mod_wsgi решило проблему для Firefox.
Ограничивая свое исследование проблемой взаимодействия между Apache и Safari, я наткнулся на этот отчет об ошибке для Apache https://bugs.webkit.org/show_bug.cgi?id=5760, который описывает нечто очень похожее на то, что происходит, и, по-видимому, все еще открыт. Прочитав это, у меня возникла идея попробовать отключить поддержку активности, и, хотя мне нужно протестировать его более тщательно, похоже, что проблема исчезла.
Просто:
BrowserMatch "Safari" nokeepalive
в конфигурации Apache сделали свое дело.
Я получил это исключение с этими данными. 'HTTP_USER_AGENT': 'Mozilla / 4.0 (совместимый; 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)',
Долгое время здесь не было ответа, но я испытал это на себе и попробовал несколько вещей, чтобы решить эту проблему. Кажется, в моем случае это произошло, если кто-то отменил загрузку (или потерял соединение) во время загрузки.
Вы можете попробовать это самостоятельно, чтобы увидеть, не вызывает ли это «IOError: request data read error» для вас: загрузите достаточно большой файл, чтобы вы могли отсоединить кабель Ethernet от вашего компьютера или маршрутизатора. Подождите немного и посмотрите, получите ли вы сообщение об ошибке. Я делаю это каждый раз!
Извините, это не так: я могу загружать большие файлы, а с маленькими все равно не получается. См. Обновленный вопрос. Спасибо, в любом случае.