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

标签 python json django httpresponse zip

我一直在为这个问题绞尽脑汁。 django 有没有办法从单个 HttpResponse 提供多个文件?

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

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 文件的方法,但我没有这样做,因为我能找到的所有示例都有带有路径和名称的文件,在这种情况下我真的没有。

更新:

我尝试使用以下方法集成 zartch 的解决方案以获取 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 中,您可以在管理员中存档

类似:

    def zipFiles(files):
        outfile = StringIO()  # io.BytesIO() for python 3
        with zipfile.ZipFile(outfile, 'w') as zf:
            for n, f in enumerate(files):
                zf.writestr("{}.csv".format(n), f.getvalue())
        return outfile.getvalue()

    zipped_file = zip_files(myfiles)
    response = HttpResponse(zipped_file, content_type='application/octet-stream')
    response['Content-Disposition'] = 'attachment; filename=my_file.zip'

关于python - 如何在 HttpResponse Django 中返回多个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42814732/

相关文章:

python - Cuda错误消息:F ./tensorflow/core/util/cuda_launch_config.h:127]检查失败:work_element_count> 0(0与0)

python - 使用fft返回向后输出计算互相关

javascript - 显示对象数组中的嵌套对象

python - 根据查询数据创建键值对

python - Django国际化无效(makemessages未找到.py文件)

python - libv8 需要安装 python 2 才能构建 - Windows

javascript - 如何将包含带引号的字符串的JavaScript对象从node.js传递到浏览器?

javascript - 将解析的REST API与AJAX结合使用时,代码107无效的JSON

django - Jinja - 加载自定义模板标签集

python - 计算不同数据帧中两个列表之间的匹配数python