La solución es la siguiente.
Utilice el módulo Python zipfile para crear un archivo comprimido, pero como el archivo especifique el objeto StringIO (el constructor ZipFile requiere un objeto similar a un archivo). Agregue los archivos que desea comprimir. Luego, en su aplicación Django, devuelva el contenido del objeto StringIO en HttpResponse
con mimetype establecido en application/x-zip-compressed
(o al menos application/octet-stream
). Si lo desea, puede configurar el encabezado content-disposition
, pero esto no debería ser realmente necesario.
Pero tenga cuidado, crear archivos comprimidos en cada solicitud es una mala idea y esto puede matar su servidor (sin contar los tiempos de espera si los archivos son grandes). El enfoque basado en el rendimiento consiste en almacenar en caché la salida generada en algún lugar del sistema de archivos y regenerarla solo si los archivos fuente han cambiado. Una idea aún mejor es preparar los archivos por adelantado (por ejemplo, mediante un trabajo cron) y hacer que su servidor web los sirva como estáticos habituales.
StringIO desaparecerá en Python 3.0, por lo que es posible que desee colocar el código de forma acorde. –
No se ha ido, solo se movió al módulo io. http://docs.python.org/3.0/library/io.html#io.StringIO –
Solo como una idea, ya que estás creando manualmente una HttpResponse, ¿no podrías usar eso como el buffer? Con eso me refiero a pasar la respuesta a 'zipfile' y dejar que escriba directamente sobre eso. Lo he hecho con otras cosas. Si se trata de flujos pesados, podría ser más rápido y más eficiente en la memoria. – Oli