Django学习笔记之视图高级-CSV文件生成
生成CSV文件
有时候我们做的网站,需要将一些数据,生成有一个CSV
文件给浏览器,并且是作为附件的形式下载下来。以下将讲解如何生成CSV
文件。
生成小的CSV文件
这里将用一个生成小的CSV
文件为例。我们用Python
内置的csv
模块来处理csv
文件,并且使用HttpResponse
来将csv
文件返回回去。示例代码如下:
import csv
from django.http import HttpResponse
def csv_view(request):
response = HttpResponse(content_type='text/csv')
response['Content-Disposition'] = 'attachment; filename="somefilename.csv"'
writer = csv.writer(response)
writer.writerow(['username', 'age', 'height', 'weight'])
writer.writerow(['zhiliao', '18', '180', '110'])
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
文件。示例代码如下:
模板文件:
{% for row in data %}
"{{ row.0|addslashes }}", "{{ row.1|addslashes }}", "{{ row.2|addslashes }}", "{{ row.3|addslashes }}", "{{ row.4|addslashes }}"
{% endfor %}
视图函数:
from django.http import HttpResponse
from django.template import loader, Context
def some_view(request):
response = HttpResponse(content_type='text/csv')
response['Content-Disposition'] = 'attachment; filename="somefilename.csv"'
csv_data = (
('First row', 'Foo', 'Bar', 'Baz'),
('Second row', 'A', 'B', 'C', '"Testing"', "Here's a quote"),
)
t = loader.get_template('my_template_name.txt')
response.write(t.render({"data": csv_data}))
return response
生成大的CSV文件
以上的例子是生成的一个小的csv
文件,如果想要生成大型的csv
文件,那么以上方式将有可能会发生超时的情况(服务器要生成一个大型csv文件,需要的时间可能会超过浏览器默认的超时时间)。这时候我们可以借助另外一个类,叫做StreamingHttpResponse
对象,这个对象是将响应的数据作为一个流返回给客户端,而不是作为一个整体返回。示例代码如下:
class Echo:
"""
定义一个可以执行写操作的类,以后调用csv.writer的时候,就会执行这个方法
"""
def write(self, value):
return value
def large_csv(request):
rows = (["Row {}".format(idx), str(idx)] for idx in range(655360))
pseudo_buffer = Echo()
writer = csv.writer(pseudo_buffer)
response = StreamingHttpResponse((writer.writerow(row) for row in rows),content_type="text/csv")
response['Content-Disposition'] = 'attachment; filename="somefilename.csv"'
return response
这里我们构建了一个非常大的数据集rows
,并且将其变成一个迭代器。然后因为StreamingHttpResponse
的第一个参数只能是一个生成器,因此我们使用圆括号(writer.writerow(row) for row in rows)
,并且因为我们要写的文件是csv
格式的文件,因此需要调用writer.writerow
将row
变成一个csv
格式的字符串。而调用writer.writerow
又需要一个中间的容器,因此这里我们定义了一个非常简单的类Echo
,这个类只实现一个write
方法,以后在执行csv.writer(pseudo_buffer)
的时候,就会调用Echo.writer
方法。
关于StreamingHttpResponse
这个类是专门用来处理流数据的。使得在处理一些大型文件的时候,不会因为服务器处理时间过长而到时连接超时。这个类不是继承自HttpResponse
,并且跟HttpResponse
对比有以下几点区别:
- 这个类没有属性
content
,相反是streaming_content
。 - 这个类的
streaming_content
必须是一个可以迭代的对象。 - 这个类没有
write
方法,如果给这个类的对象写入数据将会报错。
注意:StreamingHttpResponse
会启动一个进程来和客户端保持长连接,所以会很消耗资源。所以如果不是特殊要求,尽量少用这种方法。
Django学习笔记之视图高级-CSV文件生成的更多相关文章
- Django学习笔记之视图高级-HTTP请求与响应
Django限制请求method 常用的请求method GET请求 GET请求一般用来向服务器索取数据,但不会向服务器提交数据,不会对服务器的状态进行更改.比如向服务器获取某篇文章的详情. POST ...
- Django学习笔记之视图高级-类视图
类视图 在写视图的时候,Django除了使用函数作为视图,也可以使用类作为视图.使用类视图可以使用类的一些特性,比如继承等. View django.views.generic.base.View是主 ...
- Django学习笔记之视图高级-错误处理
错误处理 在一些网站开发中.经常会需要捕获一些错误,然后将这些错误返回比较优美的界面,或者是将这个错误的请求做一些日志保存.那么我们本节就来讲讲如何实现. 常见的错误码 404:服务器没有指定的url ...
- Django 学习笔记之模型高级用法
目录 1 复杂的字段类型 1.1 整数类型的区别 1.2 自增类型的区别 1.3 时间类型 1.4 FilePathField 1.5 FileField 1.6 ImageField 2 关系字段 ...
- 【学习笔记】python3中csv文件使用
1. reader=csv.reader(f, delimiter=','):按行读取数据,reader为生成器,读取的每行数据为列表格式,可以通过delimiter参数指定分隔符. import c ...
- Django:学习笔记(9)——视图
Django:学习笔记(9)——视图 基础视图 基于函数的视图,我们需要在使用条件语句来判断请求类型,并分支处理.但是在基于类的视图中,我们可以在类中定义不同请求类型的方法来处理相对应的请求. 基于函 ...
- Django:学习笔记(8)——视图
Django:学习笔记(8)——视图
- Python框架之Django学习笔记(十七)
Django框架之表单(续二) 今天的这篇博客将是Django学习笔记博客的最后一篇,基本每周最少一篇的Django框架学习,坚持到今天也实属不易,当然了,这个框架的学习仅仅是Django框架的基础部 ...
- Django学习笔记(16)——扩展Django自带User模型,实现用户注册与登录
一,项目题目:扩展Django自带User模型,实现用户注册与登录 我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统.此时我们需要实现包括用户注册,登录,用户认证,注销,修改密码等功能. ...
随机推荐
- kali linux 配置嵌入式开发环境
kali linux 2018.2 x64 一.支持i386库 如果你是64位的Kali Linux系统,用如下命令添加i386架构支持到你的开发环境. dpkg --add-architecture ...
- Python 习题一
1.使用while循环输入 1 2 3 4 5 6 8 9 10 # Author:Tony.lou i = 1 while i < 11: if i == 7: pass else: prin ...
- 谱聚类(Spectral Clustring)原理
谱聚类(spectral clustering)是广泛使用的聚类算法,比起传统的K-Means算法,谱聚类对数据分布的适应性更强,聚类效果也很优秀,同时聚类的计算量也小很多,更加难能可贵的是实现起来也 ...
- L360 Most People Spend Their Time in Just 25 Places
Some people are always out on the town, going to concerts, restaurant openings, you name it. They're ...
- [RESTful] RESTful是什么,为什么要使用它
RESTful是什么? 本质:一种软件架构风格 核心:面向资源 解决的问题:降低开发的复杂性,提高系统的可伸缩性 设计概念和准则: 1.网络上所有的事物都可以被抽象为资源 2.每个资源都有唯一的资源标 ...
- json_encode 的局限 , 使用自定义的函数 .returnJson.
$arr = array("liming", "tom", "green"); $arr2 = array( 1 => "l ...
- 北大poj- 1012
Joseph Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 56348 Accepted: 21526 Descript ...
- 宝塔MySQL服务自动停止重启的解决方法
现象:客户端MYSQL无法链接 提示超过 max_connections 如果重新启动MYSQL或停止MYSQL 及重新启动系统时 需要很长时间 1个小进左右 问题描述 服务器上安装的 MySQL,会 ...
- WEB学习笔记8-添加javascript禁用的提示
最常用的方式是使用<noscript>标签,此标签就是当javascript被禁用或者不被支持的时候提供一种代替方式,即<noscript>标签的内容会在此时被浏览器解析,作为 ...
- tomcat配置去掉项目名称
在web项目中,把代码部署到服务器上访问时都不带项目名,可以配置tomcat 在tomcat安装目录下,找到conf/server.xml打开 <Host name="localhos ...