使用 StreamingHttpResponse 流式传输和下载大型 CSV 文件

Streaming & downloading Large CSV files using StreamingHttpResponse

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

因此,我在按钮上单击 post 到我希望呈现的视图,然后 return 响应。这是一个 $.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

所以经过大量修改后,就我所知,它将 'stream'(?) 数据返回到 HTML 页面,console.log 将输出'files' 数据但是我没有得到任何形式的文件或下载,只是数据控制台中的日志。

我不知道我是否误解了 StreamingHttpResponse 的工作原理,我打算在客户端做更多的事情以便通过流下载它,但我已经阅读了文档但我没有更清晰。

任何帮助将不胜感激,因为我很困惑,干杯!

我遇到的问题是使用 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' %}");
    });
  })

一切都按需运行!