Python 如何在HttpResponse Django中返回多个文件

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

我一直在为这个问题绞尽脑汁。django中有没有一种方法可以从一个HttpResponse服务多个文件

我有一个场景,在这个场景中,我循环遍历一个json列表,并希望将所有这些作为文件从我的管理视图返回

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列表从这里转发到导出视图以使其正常工作?我更新了答案。也许把文件打包在一个压缩包里就行了。