108:生成和下载csv文件

生成CSV文件:

有时候我们做的网站,需要将一些数据,生成有一个CSV文件给浏览器,并且是作为附件的形式下载下来。以下将讲解如何生成CSV文件。

生成小的CSV文件:

这里将用一个生成小的CSV文件为例,来把生成CSV文件的技术要点讲到位。我们用Python内置的csv模块来处理csv文件,并且使用HttpResponse来将csv文件返回回去。示例代码如下:

from django.http import HttpResponse, JsonResponse
import json, csv


def small_csv(request):
    response = HttpResponse(content_type='text/csv')
    response['Content-Disposition'] =  "attachment;filename='userinfo.csv'"
    my_write = csv.writer(response)
    my_write.writerow(['username','age'])
    my_write.writerow(['tom','21'])
    my_write.writerow(['jack','22'])
    return response

这里再来对每个部分的代码进行解释:

  • 我们在初始化HttpResponse的时候,指定了Content-Type为text/csv,这将告诉浏览器,这是一个csv格式的文件而不是一个HTML格式的文件,如果用默认值,默认值就是html,那么浏览器将把csv格式的文件按照html格式输出,这肯定不是我们想要的。
  • 第二个我们还在response中添加一个Content-Disposition头,这个东西是用来告诉浏览器该如何处理这个文件,我们给这个头的值设置为attachment;,那么浏览器将不会对这个文件进行显示,而是作为附件的形式下载,第二个filename="somefilename.csv"是用来指定这个csv文件的名字。
  • 我们使用csv模块的writer方法,将相应的数据写入到response中。

csv文件定义成模板:

我们还可以将csv格式的文件定义成模板,然后使用Django内置的模板系统,并给这个模板传入一个Context对象,这样模板系统就会根据传入的Context对象,生成具体的csv文件。示例代码如下:

模板文件:

# 文件路径是:工程template目录下:
{% for row in rows %}{{ row.0 }},{{ row.1 }}
{% endfor %}

视图函数:

def template_csv(request):
    resp = HttpResponse(content_type='text/csv')
    resp['Content-Disposition'] = "attachment;filename='templateinfo.csv'"
    context = {
        'rows':
            [
                ['username', 'age'],
                ['bob',19],
                ['marry', 20],
            ]
    }
    template =loader.get_template('template.txt')
    csv_template = template.render(context)
    resp.content = csv_template
    return resp

猜你喜欢

转载自www.cnblogs.com/zheng-weimin/p/10415876.html