【发布时间】:2011-08-16 10:11:59
【问题描述】:
我正在使用 Django 和 Python2.6 为每个用户生成自定义呈现的 Django 模板的 zip 文件,以下载自定义的zip 文件。目前views.py中的代码是这样的:
def download(request):
response = HttpResponse(mimetype='application/x-zip-compressed')
response['Content-Disposition'] = 'attachment; filename=download.zip'
myzip = zipfile.ZipFile(response, 'w')
now = datetime.datetime.now()
zipInfo = zipfile.ZipInfo('thefile.txt', (now.year, now.month, now.day, now.hour, now.minute, now.second))
myzip.writestr(zipInfo, render_to_string('template.txt', locals(), context_instance=RequestContext(request)))
myzip.close()
return response
大多数情况下,这工作正常:zip 文件(在此示例中包含单个 txt 文件)已正确下载,我可以提取内容。但是,唯一的问题是,对于我的默认用户,生成文件的权限既不是read 也不是write,我的网站用户也不是。
如何在下载前更改自动生成文件的权限?
更新:
按照 Mike 的建议,我已尝试使用 os.chmod 和 os.fchmod,但这要么需要路径名(我没有),要么会报错(fchmod):
ZipFile instance has no attribute '__trunc__'
我想,一个选项是先保存 zip 文件,设置权限,然后允许下载,但这似乎有点矫枉过正——必须有更好的方法来解决这个简单的问题。有人有什么建议或想法吗?
更新2:
似乎这个问题仅限于 Unix 系统,因为它在 Windows 和(显然)OS X 中运行良好。我发现了一个类似的线程here。据我所知,它一定与writestr方法有关。如何为使用writestr 添加到 zip 文件的文件设置权限?
【问题讨论】:
-
哪个文件的权限错误:下载的ZIP文件还是压缩文件中的文本文件?
-
@Mike DeSimone:zip 文件中的文本文件。
-
@vartec:是的,这似乎是我问题的根源。响应下载为 zip 文件,但内容权限错误,我无法设置权限,因为没有要设置的文件(还)。
-
@vartec:最后,是的。但很长一段时间以来,我一直认为这个问题与我在 Django 中返回 zip 文件作为响应有关 - 所以也许有一天其他使用 Django 的人可能会做出同样的错误假设,然后这会有所帮助。
标签: python django permissions zip