Файл возврата django rest framework

У меня есть следующий вид в моих views.py -

class FilterView(generics.ListAPIView):
    model = cdx_composites_csv

    def get(self, request, format=None):
        vendor = self.request.GET.get('vendor')
        filename = self.request.GET.get('filename')
        tablename = filename.replace(".","_")
        model = get_model(vendor, tablename)
        filedate = self.request.GET.get('filedate')        
        snippets = model.objects.using('markitdb').filter(Date__contains=filedate)
        serializer = cdx_compositesSerializer(snippets, many=True)
        if format == 'raw':
            zip_file = open('C:\temp\core\files\CDX_COMPOSITES_20140626.zip', 'rb')
            response = HttpResponse(zip_file, content_type='application/force-download')
            response['Content-Disposition'] = 'attachment; filename="%s"' % 'CDX_COMPOSITES_20140626.zip'
            return response

        else:
            return Response(serializer.data)

Он отлично работает для xml, json, csv, но когда я пытаюсь использовать raw, он не возвращает файл, вместо этого он дает "детали": "Не найдено" "почему это происходит?

URL-адрес, который я делаю, выглядит следующим образом:

Пример json, который работает -

http://dt-rpittom:8000/testfilter/?vendor=markit&filename=cdx_composites.csv&filedate=2014-06-26&format=json

Это должно вернуть zip файл для загрузки.

http://dt-rpittom:8000/testfilter/?vendor=markit&filename=cdx_composites.csv&filedate=2014-06-26&format=raw

Ответ 1

Я не знаю, зачем мне это нужно - может быть что-то внутреннее для Django Rest Framework, которое не позволяет помещать пользовательские методы в формат?

Я просто изменил его на следующее -

if fileformat == 'raw':
    zip_file = open('C:\temp\core\files\CDX_COMPOSITES_20140626.zip', 'rb')
    response = HttpResponse(FileWrapper(zip_file), content_type='application/zip')
    response['Content-Disposition'] = 'attachment; filename="%s"' % 'CDX_COMPOSITES_20140626.zip'
    return response

Затем в моем URL-адрес просто нажмите новое значение, и он отлично работает. Мне бы очень хотелось знать, почему я не могу использовать формат, хотя бы для работы с файлом.

Ответ 2

Попробуйте использовать FileWrapper:

from django.core.servers.basehttp import FileWrapper

...

if format == 'raw':
    zip_file = open('C:\temp\core\files\CDX_COMPOSITES_20140626.zip', 'rb')
    response = HttpResponse(FileWrapper(zip_file), content_type='application/zip')
    response['Content-Disposition'] = 'attachment; filename="%s"' % 'CDX_COMPOSITES_20140626.zip'
    return response
...

Кроме того, я бы использовал application/zip вместо application/force-download.