我已经使用django导入导出为用户提供数据的CSV/XLS导出功能一段时间了,但随着数据集越来越大,我遇到了服务器超时的问题。
我知道使用StreamingHttpResponse
是可能的,但从我所看到的情况来看,这是通过编写自己的CSV编写器函数来输出数据来实现的,至少在最初,我觉得用我目前的方法无法做到这一点。
当您使用django导入导出模型资源生成文件时,是否可以流式传输响应?
这是我目前已经实现的代码,使用标准的HttpResponse
;
class ExportConsolePlacesView(ClientPlacesView, View):
"""
Export view for all places, either incomplete or complete.
"""
model = Place
http_method_names = ['get', ]
def get(self, request, *args, **kwargs):
self.object_list = self.get_queryset()
console_name = self.console.name.replace(' ', '_')
if kwargs['query'] == u'complete':
dataset = PlaceResource().export(
Place.objects.complete_entrants_for_console(self.console)
)
filename = '{}_complete_entrants'.format(console_name).lower()
elif kwargs['query'] == u'incomplete':
dataset = PlaceResource().export(
Place.objects.incomplete_entrants_for_console(self.console)
)
filename = '{}_incomplete_entrants'.format(console_name).lower()
export_type = kwargs['format']
_dataset_methods = {
'csv': dataset.csv,
'xls': dataset.xls
}
response = HttpResponse(
_dataset_methods[export_type], content_type=export_type
)
response[
'Content-Disposition'] = 'attachment; filename={fn}.{ext}'.format(
fn=filename,
ext=export_type
)
return response
我向django-import-export
的开发人员询问了这一点,他认为由于应用程序使用tablib
,由于tablib
的行为方式,不可能流式传输响应。
我认为不可能从django进出口使用的tablib创建出口流。
https://github.com/django-import-export/django-import-export/issues/206