在Python的Django框架中用流响应生成CSV文件的教程


Posted in Python onMay 02, 2015

在Django里,流式响应StreamingHttpResponse是个好东西,可以快速、节省内存地产生一个大型文件。

目前项目里用于流式响应的一个是Eventsource,用于改善跨系统通讯时用户产生的慢速的感觉。这个不细说了。

还有一个就是生成一个大的csv文件。

当Django进程处于gunicorn或者uwsgi等web容器中时,如果响应超过一定时间没有返回,就会被web容器终止掉,虽然我们可以通过加长web容器的超时时间来绕过这个问题,但是毕竟还是治标不治本。要根本上解决这个问题,Python的生成器、Django框架提供的StreamingHttpResponse这个流式响应很有帮助

而在csv中,中文的处理也至关重要,要保证用excel打开csv不乱码什么的。。为了节约空间,我就把所有代码贴到一起了。。实际使用按照项目的规划放置哈

上代码:

from __future__ import absolute_import
import csv
import codecs
import cStringIO


class Echo(object):

  def write(self, value):
    return value

class UnicodeWriter:

  """
  A CSV writer which will write rows to CSV file "f",
  which is encoded in the given encoding.
  """

  def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds):
    # Redirect output to a queue
    self.queue = cStringIO.StringIO()
    self.writer = csv.writer(self.queue, dialect=dialect, **kwds)
    self.stream = f
    self.encoder = codecs.getincrementalencoder(encoding)()

  def writerow(self, row):
    self.writer.writerow([handle_column(s) for s in row])
    # Fetch UTF-8 output from the queue ...
    data = self.queue.getvalue()
    data = data.decode("utf-8")
    # ... and reencode it into the target encoding
    data = self.encoder.encode(data)
    # write to the target stream
    value = self.stream.write(data)
    # empty queue
    self.queue.truncate(0)
    return value

  def writerows(self, rows):
    for row in rows:
      self.writerow(row)
from django.views.generic import View
from django.http.response import StreamingHttpResponse

class ExampleView(View):
  headers=['一些','表头']
  def get(self,request):
    result = [['第一行','数据1'],
         ['第二行','数据2']]
    echoer = Echo()
    writer = UnicodeWriter(echoer)
    def csv_itertor():
        yield codecs.BOM_UTF8
        yield writer.writerow(self.headers)
        for column in result:
          yield writer.writerow(column)

    response = StreamingHttpResponse(
      (row for row in csv_itertor()),
      content_type="text/csv;charset=utf-8")
    response['Content-Disposition'
         ] = 'attachment;filename="example.csv"'
    return response

Python 相关文章推荐
介绍Python中的fabs()方法的使用
May 14 Python
python解决方案:WindowsError: [Error 2]
Aug 28 Python
LRUCache的实现原理及利用python实现的方法
Nov 21 Python
python matplotlib坐标轴设置的方法
Dec 05 Python
Python二叉树的镜像转换实现方法示例
Mar 06 Python
django的auth认证,authenticate和装饰器功能详解
Jul 25 Python
Python绘制股票移动均线的实例
Aug 24 Python
WxPython实现无边框界面
Nov 18 Python
python通过安装itchat包实现微信自动回复收到的春节祝福
Jan 19 Python
django 外键创建注意事项说明
May 20 Python
Python实现石头剪刀布游戏
Jan 20 Python
Python破解极验滑动验证码详细步骤
May 21 Python
详细解读Python中的__init__()方法
May 02 #Python
举例讲解Python的Tornado框架实现数据可视化的教程
May 02 #Python
Python的Bottle框架中返回静态文件和JSON对象的方法
Apr 30 #Python
使用Python编写提取日志中的中文的脚本的方法
Apr 30 #Python
简单的连接MySQL与Python的Bottle框架的方法
Apr 30 #Python
Python的Bottle框架中实现最基本的get和post的方法的教程
Apr 30 #Python
Python中使用Beautiful Soup库的超详细教程
Apr 30 #Python
You might like
php.ini中date.timezone设置分析
2011/07/29 PHP
php魔术方法与魔术变量、内置方法与内置变量的深入分析
2013/06/03 PHP
PHP中常用的转义函数
2014/02/28 PHP
PHP使用gearman进行异步的邮件或短信发送操作详解
2020/02/27 PHP
javascript的事件描述
2006/09/08 Javascript
JQuery的html(data)方法与<script>脚本块的解决方法
2010/03/09 Javascript
javascript 防止刷新,后退,关闭
2010/08/07 Javascript
JQuery设置和去除disabled属性的5种方法总结
2013/05/16 Javascript
Jquery实现textarea根据文本内容自适应高度
2015/04/03 Javascript
kindeditor编辑器点中图片滚动条往上顶的bug
2015/07/05 Javascript
javascript DIV实现跟随鼠标移动
2020/03/19 Javascript
JavaScript直播评论发弹幕切图功能点集合效果代码
2016/06/26 Javascript
Angular2表单自定义验证器的实现
2016/10/19 Javascript
本地Bootstrap文件字体图标引入却无法显示问题的解决方法
2020/04/18 Javascript
Bootstrap中glyphicons-halflings-regular.woff字体报404错notfound的解决方法
2017/01/19 Javascript
jQuery插件HighCharts实现2D柱状图、折线图的组合多轴图效果示例【附demo源码下载】
2017/03/09 Javascript
微信小程序 自定义Toast实例代码
2017/06/12 Javascript
[28:28]Ti4 冒泡赛第二天NEWBEE vs NaVi 2
2014/07/15 DOTA
[00:36]DOTA2勇士令状莱恩声望物品——冥晶之厄展示
2018/05/25 DOTA
python通过urllib2爬网页上种子下载示例
2014/02/24 Python
Python变量赋值的秘密分享
2018/04/03 Python
解决Pandas to_json()中文乱码,转化为json数组的问题
2018/05/10 Python
Python实现的tcp端口检测操作示例
2018/07/24 Python
在python 中实现运行多条shell命令
2019/01/07 Python
Python制作微信好友背景墙教程(附完整代码)
2019/07/17 Python
记一次django内存异常排查及解决方法
2020/08/07 Python
学校安全工作制度
2014/01/19 职场文书
主办会计岗位职责
2014/03/13 职场文书
黄金搭档广告词
2014/03/21 职场文书
党员干部群众路线个人整改措施
2014/09/18 职场文书
出国留学单位推荐信
2015/03/26 职场文书
文艺节目主持词
2015/07/06 职场文书
2015初中政教处工作总结
2015/07/21 职场文书
《称赞》教学反思
2016/02/17 职场文书
Python天气语音播报小助手
2021/09/25 Python
python中数组和列表的简单实例
2022/03/25 Python