流媒体&使用StreamingHttpResponse下载大型CSV文件

时间:2017-06-21 09:36:45

标签: python django csv httpresponse

所以我面临的问题是尝试让我们的网络服务器导出到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是如何工作的,我打算在客户端做更多的事情,以便通过流下载它但我已经阅读了文档,我不再清楚了。

任何帮助都会非常感激,因为我很难过,欢呼你们!

1 个答案:

答案 0 :(得分:0)

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

一切都按需要运作!