使用 django-import-export 流式传输响应

Streaming a response with django-import-export

我已经使用 django-import-export 一段时间了,为用户提供 CSV/XLS 数据导出功能,但随着数据集变大,我遇到了服务器超时问题。

我知道可以使用 StreamingHttpResponse 但据我所知,这是通过编写您自己的 CSV 编写器函数来输出您的数据来完成的,至少在最初,我并不觉得这是什么东西我可以用我现在的方法。

当您使用 django-import-export 模型资源生成文件时,是否可以流式传输响应?

这是我目前实现的那种代码,具有标准 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 的方式流式传输响应行为举止。

I think it would not be possible to create stream of export from tablib which django-import-export uses.

https://github.com/django-import-export/django-import-export/issues/206