108.生成和下载csv文件

生成CSV文件

有时候我们做的网站,需要将一些数据,生成一个csv文件返回浏览器,并且是作为附件的形式下载下来。

生成小的csv文件:

生成一个小的csv文件,我们用Python内置的csv模块来处理csv文件,并且使用HttpResponse来将csv文件返回回去。采用python内置的csv模块创建csv文件示例代码如下:
from .models import User
import csv
from django.template import loader, Context


def csv_views(request):
    # 1. 采用python内置的csv模块创建csv文件
    # 初始化HttpResponse对象,默认情况下,请求的头的类型为text/html,但是如果想要生成csv文件的话
    # 就要修改请求头的content_type=text/csv
    response = HttpResponse(content_type='text/csv')
    response['Content-Disposition'] = "attachment; filename=zjy.csv"

    # 对response对象做相应的写操作,因为HttpResponse实现了一个写操作。
    writer = csv.writer(response)
    # print(writer) => <_csv.writer object at 0x000001F6ADAB51A8>
    writer.writerow(['username', 'age', 'height'])
    writer.writerow(['孤烟逐云', '19', '167'])
    return response
以上使用csv模块的writer的方法将数据写入到response中,非常的不方便,可以首先自定义一个模板,之后向模板中添加数据就可以了。

示例代码如下:

from django.template import loader
from django.http import HttpResponse


def csv_view(request):
# 初始化HttpResponse对象,默认情况下请求头的类型为text/html,如果不进行修改的话,就会按照html的格式进行解析,这样的话,就不能够得到我们想要的效果了。
    response = HttpResponse(content_type='text/csv')
    response['Content-Disposition'] = "attachment; filename=zjy.csv"
    context = {
        'rows':[
        ['username', 'age'],
        ['孤烟逐云', 18],
        ]
    }
    
    # 自定义一个模板文件位于:book/templates/book/static/zjy.txt
    # zjy.txt文件的内容为:
    # {% for row in rows %} {{ row.0 }},{{ row.1 }}
    # {% endfor %}
    
    <!--加载模板文件-->
    template = loader.get_template('book/static/zjy.txt')
    <!--向模板文件中添加数据-->
    zjy_csv = template.render(context)
    response.content = zjy_csv
    return response
总结:生成和下载csv文件的整体思路如下:
(1)初始化HttpResponse对象的请求头的content_type为text/csv,并且设置为该文件为附件可以下载同时设置文件名:['Content-Disposition']="attachment; filename=zjy.csv",添加的Content-Disposition头,用来告诉浏览器该如何处理这个文件,我们将值设置为attachment;那么浏览器将不会对这个文件进行显示,而是作为福建的形式下载,第二个参数filename设置csv文件名。
(2)定义向模板中传递的数据context 为字典类型。
(3)从django.template中导入loader 方法,加载我们自定义好的模板文件,并且将我们的context使用render函数传入我们定义好的模板。之后将已经传入数据的模板做为response.content部分。
(4)最后一步就是返回response。
始于才华,忠于颜值;每件事情在成功之前,看起来都是天方夜谭。一无所有,就是无所不能。
原文地址:https://www.cnblogs.com/guyan-2020/p/12293288.html