Die Lösung ist wie folgt.
Verwenden Sie das Python-Modul zipfile, um ein Zip-Archiv zu erstellen, aber als Datei geben Sie StringIO object an (ZipFile-Konstruktor benötigt dateiähnliches Objekt). Fügen Sie Dateien hinzu, die Sie komprimieren möchten. Dann in Ihrer Django-Anwendung zurückzukehren, den Inhalt StringIO Objekts in HttpResponse
mit MIME-Typ auf application/x-zip-compressed
(oder zumindest application/octet-stream
). Wenn Sie möchten, können Sie content-disposition
Header festlegen, aber das sollte nicht wirklich erforderlich sein.
Aber Vorsicht, das Erstellen von Zip-Archiven bei jeder Anfrage ist eine schlechte Idee und dies kann Ihren Server töten (ohne Timeouts, wenn die Archive groß sind). Der leistungsorientierte Ansatz besteht darin, die generierte Ausgabe irgendwo im Dateisystem zwischenzuspeichern und sie nur zu regenerieren, wenn Quelldateien sich geändert haben. Eine noch bessere Idee ist es, Archive im Voraus vorzubereiten (zB durch cron job) und Ihren Webserver wie üblich mit Statik zu versorgen.
StringIO wird in Python 3.0 verschwunden sein, daher sollten Sie Ihren Code entsprechend eingrenzen. –
Es ist nicht weg, nur zum io-Modul verschoben. http://docs.python.org/3.0/library/io.html#io.StringIO –
Nur ein Gedanke, wie Sie bereits manuell eine HttpResponse erstellen, können Sie das nicht als Puffer verwenden? Damit meine ich, dass ich die Antwort auf 'zipfile' übergebe und direkt darauf schreiben lasse. Ich habe es mit anderen Dingen gemacht. Wenn es sich um kräftige Streams handelt, könnte es schneller und effizienter sein. – Oli