Сжатие динамических файлов в App Engine (Python)

Могу ли я в любом случае заархивировать динамически сгенерированный контент, такой как недавно отрендеренный HTML-шаблон, в zip-файл с помощью zipfile?

Кажется, есть несколько примеров для архивирования статического содержимого, но нет примеров для архивирования динамического. Или это вообще невозможно?

Еще один вопрос: можно ли создать zip файл с кучей подпапок внутри?

Спасибо.


person checker659    schedule 08.06.2009    source источник


Ответы (3)


Вы можете добавить все, что хотите, в zip-файл, используя ZipFile.writestr():

my_data = "<html><body><p>Hello, world!</p></body></html>"
z.writestr("hello.html", my_data)

Вы также можете использовать подпапки, используя / (или os.sep) в качестве разделителя:

z.writestr("site/foo/hello/index.html", my_data)
person Schnouki    schedule 08.06.2009

Рабочий код: (для движка приложения:)

output = StringIO.StringIO()
z = zipfile.ZipFile(output,'w')
my_data = "<html><body><p>Hello, world!</p></body></html>"
z.writestr("hello.html", my_data)
z.close()

self.response.headers["Content-Type"] = "multipart/x-zip"
self.response.headers['Content-Disposition'] = "attachment; filename=test.zip"
self.response.out.write(output.getvalue())

Еще раз спасибо Шнуки и Райану.

person checker659    schedule 08.06.2009

В дополнение к отличному ответу Шнуки вы также можете передать ZipFile файлоподобный объект, например, созданный StringIO.StringIO.

person Ryan Ginstrom    schedule 08.06.2009
comment
Спасибо Райан! _ - person checker659; 08.06.2009
comment
Если вы используете Python 3, это должен быть io.BytesIO (модуль StringIO отсутствует, а zipfile ожидает байтовый буфер) - person Tim Pietzcker; 08.06.2009
comment
Упс, только что понял, что речь идет о App Engine. Вы, вероятно, должны игнорировать мой последний комментарий :), извините. - person Tim Pietzcker; 08.06.2009