Django Rest возвращает 0 байт zip-файла в ответ

#python #django #django-rest-framework

#python #django #django-rest-framework

Вопрос:

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

 pdf_file = HTML(string=rendered_html, base_url=request.build_absolute_uri()).write_pdf()
temp = tempfile.TemporaryFile()
archive = zipfile.ZipFile(temp, 'w', zipfile.ZIP_DEFLATED)
with archive:
    archive.writestr('report.pdf', pdf_file)
wrapper = FileWrapper(temp)

http_response = HttpResponse(wrapper, content_type='application/zip')
http_response['Content-Disposition'] = 'attachment; filename=report.zip'

return http_response
  

Проблема в том, что я получаю в ответ zip-архив размером 0 байт. Что я делаю не так?

ОБНОВЛЕНО

Также я добавляю эти 2 строки кода раньше return , но с ним я получаю seek of closed file

 http_response['Content_Length'] = temp.tell()
temp.seek(0)
  

Комментарии:

1. кажется, вам следует добавить temp.seek()

2. @AndreyBerenda, я использовал его раньше, но с ним я получаю ошибку «поиск закрытого файла»

3. HttpResponse будет полностью использовать файл при его создании. Попробуйте выполнить temp.seek() вызов перед созданием HttpResponse .

Ответ №1:

Спасибо за помощь @Will Keeling

Я решаю свою проблему, добавляя temp.seek() before HttpResponse и удаляя http_response['Content_Length'] = temp.tell() , потому что мы не можем использовать temp после его закрытия.