Django流式CSV过早停止

时间:2016-09-22 19:32:37

标签: python django csv

我使用以下代码将表及其所有字段流式传输到csv然后再返回给用户。它或多或少只是django网站上的例子。

        # CSV header
        header = [field.name for field in model._meta.fields]
        results = model.objects.all()

        # Generate a streaming output in case the file is large
        h = []
        h.append(header)
        rows = ([getattr(item, field) for field in header] for item in results)
        # Need to add the header to the front
        chained = itertools.chain(h, rows)

        pseduo_buffer = Echo()  # File like object that just returns value when write is called
        writer = csv.writer(pseduo_buffer)
        response = StreamingHttpResponse((writer.writerow(row) for row in chained), content_type="text/csv")
        filename = "{}_{}_{}.csv".format(app_name, model_name, date_str)
        response['Content-Disposition'] = 'attachment; filename="{}"'.format(filename)

        return response

问题似乎是对于较大的数据集,它会在实际完成从表中获取所有数据之前随机停止流。总文件大小约为12MB左右,但它将从500k随机停止流式传输到大约8MB。

我在生产环境中只看到过这种情况。当我在开发设置中执行此操作时,我会获得整个文件。它全都在docker容器中运行,所以理论上它在两个实例中都是相同的设置。不确定是否有其他与服务器相关的设置可能导致此问题?

我们的devops人确实说他增加了负载均衡器超时,但我认为流媒体响应不应该导致超时,因为它不断发送数据。

它是否有可能与查询的执行方式有关,并且它认为它实际上已经完成了(可能是糟糕的查询性能 - 很多连接等等) )?

谢谢大家 -

0 个答案:

没有答案