Confundido acerca de convertir un archivo CSV en un archivo ZIP en django

Tengo una vista que toma los datos de mi sitio y luego los convierte en un archivo csv comprimido zip. Aquí está mi código de trabajo sans zip:

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 

y funciona muy bien. Ahora quiero que ese archivo se comprima antes de que se envíe. Aquí es donde me quedo atascado.

 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 

Pero eso no es así y no tengo idea de cómo hacer esto.

Observe cómo, en el caso de trabajo, return response … y en el caso NO de trabajo, devuelve z , que NO es un HttpResponse por supuesto (¡aunque debería ser!).

Entonces: use su csv_writer NO en la response sino en un archivo temporal; zip el archivo temporal; ¡y escribe ESA la stream de zip en la response !

Ok lo tengo Aquí está mi nueva función:

 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 
 zipfile.ZipFile(response,'w') 

Parece que no funciona en python 2.7.9. La respuesta es un objeto django.HttpResponse (que se dice que es similar a un archivo) pero da un error “El objeto HttpResponse no tiene un atributo ‘buscar’ . Cuando se ejecuta el mismo código en Python 2.7.0 o 2.7.6 (No lo he probado en otras versiones) está bien … Así que es mejor que lo pruebes con Python 2.7.9 y veas si tienes el mismo comportamiento.