我使用以下代码将表及其所有字段流式传输到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人确实说他增加了负载均衡器超时,但我认为流媒体响应不应该导致超时,因为它不断发送数据。
它是否有可能与查询的执行方式有关,并且它认为它实际上已经完成了(可能是糟糕的查询性能 - 很多连接等等) )?
谢谢大家 -