Django Python сохранить записи в блоге базы данных в zipfile? - PullRequest
0 голосов
/ 16 февраля 2020

У меня есть блог django, и я хочу загрузить zip-файл резервной копии со всеми записями. Текст сообщения в блоге хранится в базе данных.

Я написал этот код с целью получить zip-файл, чтобы сохранить несколько файлов .txt в главном zip-каталоге, но весь этот код делает выводит один поврежденный zip-файл. Его нельзя распаковать, но по какой-то причине его можно открыть в Word, и в нем отображается весь текст сообщения блога.

def download_backups(request):
    zip_filename = "test.zip"
    s = BytesIO()
    zf = zipfile.ZipFile(s, "w")
    blogposts = Blog.objects.all()
    for blogpost in blogposts:
        filename = blogpost.title + ".txt"
        zf.writestr(filename, blogpost.content)
    resp = HttpResponse(s.getvalue())
    resp['Content-Disposition'] = 'attachment; filename=%s' % zip_filename
    return resp

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 16 февраля 2020

Исходя из этого ответа на другой вопрос , у вас может быть проблема с режимом чтения. Вам также потребуется вызвать zf.close(), явно или неявно, прежде чем файл будет фактически завершен.

Я думаю, что есть более простой способ обработки этого с использованием временного файла, который должен иметь преимущество: не нужно помещать все содержимое файла в память.

from tempfile import TemporaryFile
from zipfile import ZipFile


with TemporaryFile() as tf:
    with ZipFile(tf, mode="w") as zf:
        zf.writestr("file1.txt", "The first file")
        zf.writestr("file2.txt", "A second file")
    tf.seek(0)
    print(tf.read())

Блоки with здесь приведут к тому, что ваш временный файл выйдет из области видимости и будет удален, а zf.close будет вызван неявно перед вами попытайтесь прочитать файл.

Если цель здесь - просто создать резервную копию данных, а не использовать указанный формат c, я бы предложил использовать встроенный dumpdata команда управления. Вы можете вызвать его из кода , если хотите представить результаты в таком виде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...