python - 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
任何帮助表示赞赏。
解决方案
根据对另一个问题的回答,您可能遇到了阅读模式的问题。在文件实际完成之前,您还需要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
管理命令。如果您想通过这样的视图提供结果,您可以从代码中调用它。
推荐阅读
- ios - 以编程方式为我的 NavigationBar 创建了一个标题,但是,没有出现在正确的位置?
- python - 在Django过滤器中获取小写/无空格名称等于小写/无空格参数的对象
- python - Django REST Swagger 不显示 POST 方法
- python - .decode('hex') Python2.7 与 Python3
- python - PyQt5 中的 LineEdit 框
- python - 我怎样才能使程序循环直到满足条件?
- html - 为表达式内的 Ruby 字符串中的单词添加文本样式
- c# - 过滤时来自命令参数错误的 ID
- android - 有没有人能够在 WebView 中运行 HTTP?
- python - 根据第三个变量分配另一个变量的变量值