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 {},{}\n".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
相关文章
相关标签/搜索