在HttpResponse中返回python字节数组

在HttpResponse中返回python字节数组,python,django,Python,Django,我有一个django视图,我想返回一个Excel文件。代码如下: def get_template(request, spec_pk): spec = get_object_or_404(Spec, pk=spec_pk) response = HttpResponse(spec.get_template(), mimetype='application/ms-excel') response['Content-Disposition'] = 'attachment;

我有一个django视图,我想返回一个Excel文件。代码如下:

def get_template(request, spec_pk):
    spec = get_object_or_404(Spec, pk=spec_pk)

    response = HttpResponse(spec.get_template(), mimetype='application/ms-excel')
    response['Content-Disposition'] = 'attachment; filename=%s_template.xls' % spec.name
    return response
在该示例中,
spec.get_template()
的类型是
,它包含Excel电子表格的二进制数据

问题是,当我试图下载该视图,并用Excel打开它时,它以乱码二进制数据的形式出现。但是我知道
bytearray
是正确的,因为如果我执行以下操作:

f = open('temp.xls', 'wb')
f.write(spec.get_template())
我可以在Excel中完美地打开
temp.xls

我甚至将我的视图修改为:

def get_template(request, spec_pk):
    spec = get_object_or_404(Spec, pk=spec_pk)
    f = open('/home/user/temp.xls', 'wb')
    f.write(spec.get_template())
    f.close()

    f = open('/home/user/temp.xls', 'rb')
    response = HttpResponse(f.read(), mimetype='application/ms-excel')
    response['Content-Disposition'] = 'attachment; filename=%s_template.xls' % spec.name
    return response
它工作得很好-我可以从浏览器打开xls文件到Excel,一切都很好


所以我的问题是-在我将它传递给
HttpResponse
之前,我需要做什么。为什么将它保存为二进制文件,然后重新打开它可以很好地工作,但是传递
bytearray
本身会导致数据混乱?

好的,通过完全随机(并且非常持久)的尝试和错误,我找到了一个使用python
binascii
模块的解决方案

这项工作:

response = HttpResponse(binascii.a2b_qp(spec.get_template()), mimetype='application/ms-excel')
根据binascii.a2b_qp的python文档:

将引用的可打印数据块转换回二进制并返回二进制数据。一次可以通过多条线路。如果可选参数标头存在且为true,则下划线将被解码为空格


希望有人能告诉我为什么将它保存为二进制文件,然后重新打开它会起作用。

这是一个杂乱无章的ASCII文本,非常、非常、非常长。根据
文件
ASCII文本,具有非常长的行,没有行终止符
,不幸的是,这不够具体。你必须让他们通过一个二进制的差异。。。根据
cmp
bad.xls good.xls不同:字节1,第1行
找到了一个解决方案(回答如下),感谢您的帮助。