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

标签 python django csv httpresponse

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

因此,我在按钮上单击一个帖子到我希望渲染的 View ,然后返回响应。这是一个 $.ajax 函数,但我在测试过程中更改了它,现在看起来像这样:

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

View 中的代码如下所示(恰好是 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 将输出"file"数据,但我没有得到任何形式的文件或下载,只是数据控制台中的日志。

我不知道我是否误解了 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' %}");
    });
  })

一切都按需要进行!

关于python - 使用 StreamingHttpResponse 流式传输和下载大型 CSV 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44672304/

相关文章:

c# - 带有奇怪字符的 ASP.NET CSV Excel 问题

python - spyder - 清除变量资源管理器以及内存中的变量

python - 类 httpresponse 结果为 405 - django

java - 从不同 Tomcat 上的 Tomcat webapps 读取文件

python - Django 中的反向访问器冲突

django - 带有 Django 上传表单的空 Request.FILES

R-将外部指标加载到Quantstrat

python - Pandas 将小时和分钟列合并为时间

python - many2many 字段都是相同的值?

python - Python Matplotlib 动画绘图的更新速度缓慢。我怎样才能让它更快?