首页 > 解决方案 > Django Python 将数据库博客文章保存到 zip 文件?

问题描述

我有一个 django 博客,想下载一个包含所有条目的备份 zip 文件。博客文章文本内容存储在数据库中。

我编写此代码的目的是尝试让 zipfile 将一堆 .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

任何帮助表示赞赏。

标签: pythondjangopython-3.x

解决方案


根据对另一个问题的回答,您可能遇到了阅读模式的问题。在文件实际完成之前,您还需要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在您尝试读取文件之前被隐式调用。

但是,如果这里的目标只是备份数据而不是使用这种特定格式,我建议使用内置的dumpdata管理命令。如果您想通过这样的视图提供结果,您可以从代码中调用它。


推荐阅读