使用 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' %}");
});
})
一切都按需运行!
所以我面临的问题是试图让我们的网络服务器导出到 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' %}");
});
})
一切都按需运行!