Решение заключается в следующем.
Используйте модуль Python zipfile для создания zip-архива, но в качестве файла укажите StringIO объект (для конструктора ZipFile требуется файлоподобный объект). Добавьте файлы, которые вы хотите сжать. Затем в вашем приложении Django верните содержимое объекта StringIO в HttpResponse
с mimetype, установленным в application/x-zip-compressed
(или, по крайней мере, application/octet-stream
). Если хотите, вы можете установить заголовок content-disposition
, но это не должно быть обязательным.
Но будьте осторожны, создание zip-архивов при каждом запросе - плохая идея, и это может убить ваш сервер (не считая тайм-ауты, если архивы большие). Подход с точки зрения производительности заключается в том, чтобы кэшировать сгенерированный вывод где-то в файловой системе и восстанавливать его только в случае изменения исходных файлов. Еще лучшая идея - подготовить архивы заранее (например, по заданию cron) и сделать так, чтобы ваш веб-сервер обслуживал их как обычную статику.