zoukankan      html  css  js  c++  java
  • django 生成和下载CSV文件

    一、生成小型的csv文件

    1、直接处理数据

    from django.http import HttpResponse
    import csv
    
    # 简单生成下载csv文件
    def down_csv_1(request):
        # 指定返回的类型为csv
        response = HttpResponse(content_type='text/csv')
        # 添加返回头说明如何处理这个返回对象,并指明文件名。attachment:作为附件的形式进行下载
        response['Content-Disposition'] = "attachment;filename='test.csv'"
        # 创建写的对象
        writer = csv.writer(response)
        # 写入一行数据
        writer.writerrow(['username','age'])
        # 写入下一行数据
        writer.writerrow(['Xsan',20])
        return response


    2、使用模版处理要下载的数据:

    (1)在templates文件夹下面创建处理数据的模版文件比如test.txt。
    test.txt文件

    {# 一定要将循环体和for语句写在一行,否则会出现空行的情况 #}
    {% for row in rows %}{{ row.0 }},{{ row.1 }}
    {% endfor %}

    (2)在视图函数中引用

    views.py
    from django.http import HttpResponse
    from django.template import loader
    import csv
    
    #使用模版处理要下载的数据
    def down_csv_2(request):
        # 指定返回的类型为csv
        response = HttpResponse(content_type='text/csv')
        # 添加返回头说明如何处理这个返回对象,并指明文件名。attachment:作为附件的形式进行下载
        response['Content-Disposition'] = "attachment;filename='test.csv'"
        # 创建要下载的数据,此时要和模版结合起来
        context = {
            'rows':[
            ['username','age'],
            ['Xsan',20]]
        }
        # 引用自定义的模版
        template = loader.get_template('test.txt')
        # 将要下载的数据使用模版格式化
        csv_template = template.render(context)
        # 将处理好的数据渲染至上下文
        response.content = csv_template
        return response

    二、生成大型的csv文件
    上面我们讲了生成一个小的csv文件,如果要生成大型的csv文件该如何做呢?上面的代码可能会发生超时的情况(服务器要生成一个大型的csv文件,需要的时间可能会超过浏览器默认的时间)。这时候我们需要借助一个类StreamingHttpResponse对象,这个对象能将响应的数据作为一个流返回给客户端,而不是作为一个整体返回。
    关于StreamingHttpResponse:
    这个类时专门用来处理流数据的。使得在处理大型文件的时候,不会因为服务器处理时间过长而导致连接超时。这个类不是继承自HttpResponse,并且跟HttpResponse对比有以下几点区别:
    1、这个类没有属性content,相反是streaming_content。
    2、这个类的streaming_content必须是一个可迭代对象。
    3、这个类没有write方法,如果给这个类的对象写入数据将会报错。
    注意:StreamingHttpResponse会启动一个进程来和客户端保持长连接,所以会很消耗资源。所以如果不是特殊要求,尽量少用这种方法。

        views.py
        from django.http import HttpResponse,StreamingHttpResponse 
        from django.template import loader
        import csv
        
        def large_csv_view(request):
            response = StreamingHttpResponse(content_type='text/csv')
            response['Content-Disposition'] = "attachment;filename='large.csv'"
            rows = ("Row {},{}
    ".format(row,row) for row in range(0,10000))
            response.streaming_content = ("username,age
    ","Xsan,20
    ")
            return response
  • 相关阅读:
    轻量级前端MVVM框架avalon
    Android开发:TextView添加超链接的简便方法
    那些年一起学过的面向对象之:4 面向对象的三大特征:封装、继承、多态
    iOS 如何创建单例对象
    phing用户手册第四章Getting Started译文
    C语言中scanf/fscanf 的%[]和%n说明符的使用方法
    listview改变选中行字体颜色
    oracle数据库单个数据文件的大小限制
    古堡算式
    java反射--注解的定义与运用以及权限拦截
  • 原文地址:https://www.cnblogs.com/xshan/p/12173862.html
Copyright © 2011-2022 走看看