Я пытаюсь создать простой способ подачи загружаемого контента с помощью Django. Идея состоит в том, что вошедшие в систему пользователи должны иметь возможность загружать (довольно большие) файлы через lighttpd.
Есть несколько сообщений об этом здесь на SO, и я наткнулся на сообщение в блоге с простым решением.
Я создал вид, как в приведенной выше ссылке (и добавил «allow-x-send-file» => «enable» в конфигурацию lighttpd), и он «работает». Когда я проверяю заголовки с помощью Firebug, я получаю правильный тип контента, длину файла и 200 ОК, но файл не загружается.
Затем я нашел решение здесь, на SO, куда отправляются дополнительные заголовки . Теперь файл обслуживается, но загруженный файл пуст. Заголовки по-прежнему правильны.
Вот мой источник (с удаленными auth_decorators и без обработки несуществующего файла):
import os
import mimetypes
import django.http
from django.conf import settings
def get_absolute_filename(filename='', safe=True):
if not filename:
return os.path.join(settings.FILE_DOWNLOAD_PATH, 'index')
if safe and '..' in filename.split(os.path.sep):
return get_absolute_filename(filename='')
return os.path.join(settings.FILE_DOWNLOAD_PATH, filename)
def retrieve_file(request, filename=''):
abs_filename = get_absolute_filename(filename)
response = django.http.HttpResponse(mimetype='application/force-download')
response['X-Sendfile'] = abs_filename
response['Content-Disposition'] = 'attachment; filename=%s' % abs_filename
response['Content-Type'] = mimetypes.guess_type(abs_filename)
response['Content-Length'] = os.path.getsize(abs_filename)
return response