Смущен превращением файла CSV в файл ZIP в django - PullRequest
2 голосов
/ 10 сентября 2009

У меня есть представление, которое берет данные с моего сайта и затем превращает их в сжатый zip-файл csv. Вот мой рабочий код без почтового индекса:

def backup_to_csv(request):
    response = HttpResponse(mimetype='text/csv')
    response['Content-Disposition'] = 'attachment; filename=backup.csv'

    writer = csv.writer(response, dialect='excel')

    #code for writing csv file go here...

    return response

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

def backup_to_csv(request):

    output = StringIO.StringIO() ## temp output file
    writer = csv.writer(output, dialect='excel')

    #code for writing csv file go here...

    response = HttpResponse(mimetype='application/zip')
    response['Content-Disposition'] = 'attachment; filename=backup.csv.zip'

    z = zipfile.ZipFile(response,'w')   ## write zip to response
    z.writestr("filename.csv", output)  ## write csv file to zip

    return response

Но это не так, и я понятия не имею, как это сделать.

Ответы [ 3 ]

5 голосов
/ 10 сентября 2009

ОК, я понял. Вот моя новая функция:

def backup_to_csv(request):

    output = StringIO.StringIO() ## temp output file
    writer = csv.writer(output, dialect='excel')

    #code for writing csv file go here...

    response = HttpResponse(mimetype='application/zip')
    response['Content-Disposition'] = 'attachment; filename=backup.csv.zip'

    z = zipfile.ZipFile(response,'w')   ## write zip to response
    z.writestr("filename.csv", output.getvalue())  ## write csv file to zip

    return response
5 голосов
/ 10 сентября 2009

Обратите внимание, как в рабочем случае вы return response ... а в нерабочем случае вы возвращаете z, что НЕ и, конечно, HttpResponse (хотя должно быть!).

Итак: используйте csv_writer НЕ на response, а на временном файле; zip временный файл; и напишите ЭТО в виде проставленного потоком в response!

1 голос
/ 22 августа 2016
zipfile.ZipFile(response,'w') 

, похоже, не работает в Python 2.7.9. ответ является объектом django.HttpResponse (который называется файловым), но выдает ошибку "Объект HttpResponse не имеет атрибут 'seek' . Когда тот же код запускается в python 2.7.0 или 2.7.6 (я не проверял его в других версиях), все в порядке ... Так что вам лучше протестировать его с python 2.7.9 и посмотрите, получите ли вы такое же поведение.

...