Python 如何在HttpResponse Django中返回多个文件
我一直在为这个问题绞尽脑汁。django中有没有一种方法可以从一个HttpResponse服务多个文件 我有一个场景,在这个场景中,我循环遍历一个json列表,并希望将所有这些作为文件从我的管理视图返回Python 如何在HttpResponse Django中返回多个文件,python,json,django,httpresponse,zipfile,Python,Json,Django,Httpresponse,Zipfile,我一直在为这个问题绞尽脑汁。django中有没有一种方法可以从一个HttpResponse服务多个文件 我有一个场景,在这个场景中,我循环遍历一个json列表,并希望将所有这些作为文件从我的管理视图返回 class CompanyAdmin(admin.ModelAdmin): form = CompanyAdminForm actions = ['export_company_setup'] def export_company_setup(self, request
class CompanyAdmin(admin.ModelAdmin):
form = CompanyAdminForm
actions = ['export_company_setup']
def export_company_setup(self, request, queryset):
update_count = 0
error_count = 0
company_json_list = []
response_file_list = []
for pb in queryset.all():
try:
# get_company_json_data takes id and returns json for the company.
company_json_list.append(get_company_json_data(pb.pk))
update_count += 1
except:
error_count += 1
# TODO: Get multiple json files from here.
for company in company_json_list:
response = HttpResponse(json.dumps(company), content_type="application/json")
response['Content-Disposition'] = 'attachment; filename=%s.json' % company['name']
return response
#self.message_user(request,("%s company setup extracted and %s company setup extraction failed" % (update_count, error_count)))
#return response
现在,这只允许我返回/下载一个json文件,因为返回将打破循环。有没有更简单的方法将所有这些附加到一个响应对象中,然后返回外部循环,并将列表中的所有json下载到多个文件中
我寻找了一种将所有这些文件打包成zip文件的方法,但我没有这样做,因为我能找到的所有示例都有带有路径和名称的文件,而在本例中我并没有这些文件
更新:
我尝试使用以下方法集成Zarch的解决方案以获得zip文件:
import StringIO, zipfile
outfile = StringIO.StringIO()
with zipfile.ZipFile(outfile, 'w') as zf:
for company in company_json_list:
zf.writestr("{}.json".format(company['name']), json.dumps(company))
response = HttpResponse(outfile.getvalue(), content_type="application/octet-stream")
response['Content-Disposition'] = 'attachment; filename=%s.zip' % 'company_list'
return response
因为我一开始就没有这些文件,所以我考虑只使用我拥有的json转储文件并添加单独的文件名。这只会创建一个空zipfile。我认为这是意料之中的,因为我确信
zf.writestr({}.json.format(company['name'])、json.dumps(company))
不是这样做的。如果有人能帮我,我将不胜感激。如果您尝试将所有文件打包在一个zip中,您可以将其归档到Admin中
比如:
def zipFiles(文件):
outfile=StringIO()#io.BytesIO()用于python 3
zipfile.zipfile(outfile,'w')作为zf:
对于枚举中的n,f(文件):
zf.writestr(“{}.csv.format(n),f.getvalue())
返回outfile.getvalue()
压缩文件=压缩文件(myfiles)
response=HttpResponse(压缩的文件,内容类型为class='application/octet-stream')
响应['Content-Disposition']='附件;filename=my_file.zip'
您试图存储在词典中并返回词典?对不起,没有收到。我已经有了要从视图下载为文件的词典列表。我基本上是在管理员视图上选择了一个对象列表,然后调用另一个方法(从操作中)来获取json提取列表,我需要在这里作为文件返回。第一个语句是否应该是response=HttpResponse(json.dumps(company_json_list),content_type=“application/json”)
因为公司只是公司列表中的项目。如果是这样,它不允许我打包它,因为我得到了ERR\u RESPONSE\u HEADERS\u MULTIPLE\u CONTENT\u DISPOSITION error.update所有视图和模板。我没听清楚。对不起,我更新了代码。它在管理操作中。我希望这能清楚地说明问题,并感谢您关注这一点。是的,我正在考虑这样做,但我对这一点还不熟悉,不知道如何存档,因为我们这里没有真正的文件。是否可以将请求或这些json列表从这里转发到导出视图以使其正常工作?我更新了答案。也许把文件打包在一个压缩包里就行了。