109.大型的csv文件的处理方式

HttpResponse对象将会将响应的数据作为一个整体返回,此时如果数据量非常大的话,长时间浏览器没有得到服务器的响应,就会超过默认的超时时间,返回超时。而StreamingHttpResponse会将响应的数据作为一个数据流返回给浏览器,这样浏览器就可以接收到服务器发送过来的数据,不会因为长期没有得到服务器的回应而返回超时。

StreamingHttpResponse:

这个类是专门用来处理流数据的,使得在处理一些大型文件的时候,不会因为服务器处理时间过长而连接超时。这个类并不是继承HttpResponse,而是继承HttpResponseBase,并且跟HttpResponse对比有以下几点区别:

(1)这个类没有一个属性content,相反是streaming_content。
(2)这个类的streaming_content必须是一个可以迭代的对象。
(3)这个类没有write方法,如果给这个类的对象写入数据将会报错。
注意:StreamingHttpResponse会启动一个进程类和客户端保持长连接,所以会很消耗资源,所以如果不是特殊要求,尽量少用这种方法。
1.使用StreamingHttpResponse生成大型csv文件并且下载,在浏览器中进行访问的时候,要注意观察浏览器的左下角的加载,或者说是进行安全连接的时间以及下载的时间,示例代码如下:
from django.http import HttpResponse, StreamingHttpResponse
from django.template import loader


# 定义一个类Echo,实现write方法
class Echo:
    def write(self, value):
        return value


def large_csv(request):
# 得到一个StreamingHttpResponse对象,并且设置文件的类型为csv
    response = StreamingHttpResponse(content_type='text/csv')
    # 不显示文件的内容,只是可以进行下载,并且设置文件的名字
    response['Content-Disposition'] = "attachment; filename=large_csv.csv"
# 因为StreamingHttpResponse对象传递的第一个参数必须是可以迭代的对象
    # ()中使用for ... in ...进行遍历,我们就可以得到一个生成器一样的对象,生成器并不会把数据一次性的返回
    rows = ("row {},{}
".format(row,row) for row in range(0,10000000))
    # 使用format()函数将后面的(row,row)与字符串中的{}进行替换
    response.streaming_content = rows
    return response
2.使用HttpResponse获取大型的csv文件并进行下载,一定要注意观察浏览器左下角文件在加载是的安全连接时间以及下载的时间,示例代码如下:
from django.http import HttpResponse
import csv


def large_view(request):
    # 初始化
    response = HttpResponse(content_type='text/csv')
    # 指定文件不显示文件内容,可以作为附件进行下载,并且指定文件名
    response['Content-Disposition'] = "attachment; filename=large_csc.csv"
    
    <!--使用python内置的csv模块中的write()方法向response对象写入数据-->
    writer = csv.writer(response)
    for row in range(0,10000000):
        writer.writerow(['row {}'.format(row),'row'.format(row)])
    return response
始于才华,忠于颜值;每件事情在成功之前,看起来都是天方夜谭。一无所有,就是无所不能。
原文地址:https://www.cnblogs.com/guyan-2020/p/12293299.html