django动态拉链内部服务器错误
Posted
技术标签:
【中文标题】django动态拉链内部服务器错误【英文标题】:django dynamic zipper internal server error 【发布时间】:2012-06-14 18:30:46 【问题描述】:我启用了调试,但它没有显示任何内容。我看到的只是“500 内部服务器错误。 我在这个脚本中做错了什么?
蟒蛇
import zipfile
from zipfile import ZipFile
import cStringIO as StringIO
from django.http import HttpResponse
from django.core.servers.basehttp import FileWrapper
def zipit (request):
files = ['/home/dbs/public_html/download/codex/video.html', '/home/dbs/public_html/download/audio/audio.html']
buffer= StringIO.StringIO()
z= zipfile.ZipFile( buffer, "w" )
[z.write(f) for f in files]
z.close()
response = HttpResponse(FileWrapper(z), content_type='application/zip')
response['Content-Disposition'] = 'attachment; filename=z.zip'
return HttpResponse(response, mimetype="application/x-zip-compressed")
【问题讨论】:
应该是def zipit (request):
,别忘了:
对不起,当我复制我的代码时,“:”没有出现。我已经在我的源代码中找到了它,这不是问题。很抱歉造成混乱
RuntimeError: 尝试读取已关闭的 ZIP 存档
是的,因为当响应尝试再次打开它时文件已关闭。
@samy.vilar 我该如何纠正这个问题?
【参考方案1】:
试试这个:
import zipfile
from zipfile import ZipFile
import cStringIO as StringIO
from django.http import HttpResponse
from django.core.servers.basehttp import FileWrapper
import os
def zipit (request):
files = ['/home/dbs/public_html/download/codex/video.html', '/home/dbs/public_html/download/audio/audio.html']
buffer = StringIO.StringIO()
z = zipfile.ZipFile(buffer, "w")
[z.write(f, os.path.join('codex', os.path.basename(f))) for f in files]
z.close()
buffer.seek(0)
response = HttpResponse(buffer.read())
response['Content-Disposition'] = 'attachment; filename=z.zip'
response['Content-Type'] = 'application/x-zip'
return response
但请尽量不要让 django 返回它从未为此设计的二进制文件,您的 http 服务器应该处理它。
【讨论】:
我可以从中下载一些东西,但是当我尝试打开下载的 zip 时,它显示“存档格式未知或已损坏” 好的测试它现在应该可以工作,但请记住,写入将保留文件的路径。 漂亮,我将如何修改它以仅包含路径中文件之前的目录。例如/home/dbs/public_html/download/codex/video.html
将被保存为codex/video.html
好的默认更新如果你不指定弧名,它将使用包含文件路径的文件名,除非你这样做。
只需将您想要的目录预先附加到文件名即可生成适当的存档结构。【参考方案2】:
上述解决方法有效,但缺点是将整个 zip 加载到内存中并且没有利用文件系统。如果您正在创建一个大型存档,这可能会给您的应用程序带来严重的内存负担。下面是一种类似的方法,可让您利用文件系统:
# imports omitted
def zipfileview(request):
fd, fpath = tempfile.mkstemp()
os.close(fd) # don't leave dangling file descriptors around...
with zipfile.ZipFile(fpath, "w") as zip:
# write files to zip here
# when done send response from file
response = HttpResponse(FileWrapper(open(fpath, 'rb')), mimetype="application/zip")
response["Content-Disposition"] = "attachment; filename=myzip.zip"
return response
【讨论】:
以上是关于django动态拉链内部服务器错误的主要内容,如果未能解决你的问题,请参考以下文章
Django - collectstatic 后出现 500 内部服务器错误