【问题标题】:Streaming & downloading Large CSV files using StreamingHttpResponse使用 StreamingHttpResponse 流式传输和下载大型 CSV 文件
【发布时间】:2017-11-24 03:12:38
【问题描述】:

所以我面临的问题是试图让我们的网络服务器导出到 CSV 按钮工作,一个要求是文件不能在本地保存,必须直接流式传输到客户端。目前,我只是想从服务器获取一个基本的 CSV 文件流式传输并保存在本地机器上,然后再担心呈现实际数据。

所以,我有,在按钮上单击我希望呈现的视图的帖子,然后返回响应。这是一个 $.ajax 函数,但我在测试期间对其进行了更改,现在看起来像这样:

$("#exportbutton").click(function(e){
    $.post("{% url 'doner:download' %}", function(data)
    {
        console.log(data);
    });
  })

视图中的代码如下所示(恰好是来自 SO 的示例的 CTRL+V):

def download(request):
    def stream():
        buffer_ = io.StringIO()
        writer = csv.writer(buffer_)
        for row in rows:
            writer.writerow(row)
            buffer_.seek(0)
            data = buffer_.read()
            buffer_.seek(0)
            buffer_.truncate()
            yield data

    response = StreamingHttpResponse(
        stream(), content_type='text/csv'
    )
    disposition = "attachment; filename=file.csv"
    response['Content-Disposition'] = disposition

    return response

因此,经过大量的修补,这就是我所得到的,它会将数据“流式传输”(?)返回 HTML 页面,console.log 将输出“文件”数据但我没有得到任何形式的文件或下载,只需在数据的控制台中登录即可。

我不知道我是否误解了 StreamingHttpResponse 的工作原理,我打算在客户端做更多的事情以便将其下载到流中,但我已经阅读了文档,但我并不清楚.

任何帮助将不胜感激,因为我被难住了,干杯!

【问题讨论】:

    标签: python django csv httpresponse


    【解决方案1】:

    我遇到的问题是使用 jQuery 发布,显然浏览器无法使用 AJAX 下载文件,所以为了修复这部分并获取文件下载,我所做的只是在 AJAX 内部(确保它在下载之前生成好了)添加行location.replace('doner/download');就是这样......

    现在 jQuery 看起来像这样:

    $("#exportbutton").click(function(e){
        $.post("{% url 'doner:download' %}", function(data)
        {
            console.log(data);
            location.replace("{% url 'doner:download' %}");
        });
      })
    

    一切都按需要运行!

    【讨论】:

      猜你喜欢
      • 2022-09-27
      • 2021-11-08
      • 1970-01-01
      • 2021-08-18
      • 1970-01-01
      • 1970-01-01
      • 2017-12-11
      • 2015-12-26
      • 2017-04-28
      相关资源
      最近更新 更多