在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 不关闭控制台的实现方法
Oct 23 Python
python socket网络编程步骤详解(socket套接字使用)
Dec 06 Python
Python语言的12个基础知识点小结
Jul 10 Python
Python中的tuple元组详细介绍
Feb 02 Python
python使用正则表达式替换匹配成功的组
Nov 17 Python
python实现比较文件内容异同
Jun 22 Python
Python 循环终止语句的三种方法小结
Jun 24 Python
Python利用WMI实现ping命令的例子
Aug 14 Python
详解在Python中以绝对路径或者相对路径导入文件的方法
Aug 30 Python
python 在sql语句中使用%s,%d,%f说明
Jun 06 Python
Python2手动安装更新pip过程实例解析
Jul 16 Python
python 模拟在天空中放风筝的示例代码
Apr 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定时更新程序设计思路分享
2014/06/10 PHP
在云虚拟主机部署thinkphp5项目的步骤详解
2017/12/21 PHP
获取Javscript执行函数名称的方法
2006/12/22 Javascript
任意位置显示html菜单
2007/02/01 Javascript
JS处理VBArray的函数使用说明
2008/05/11 Javascript
Js控制弹窗实现在任意分辨率下居中显示
2013/08/01 Javascript
jQuery DOM操作实例
2014/03/05 Javascript
Fullpage.js固定导航栏-实现定位导航栏
2016/03/17 Javascript
简单的JS轮播图代码
2016/07/18 Javascript
js图片切换具体实现代码
2016/10/13 Javascript
利用Js的console对象,在控制台打印调式信息测试Js的实现
2016/11/26 Javascript
微信小程序 弹框和模态框实现代码
2017/03/10 Javascript
bootstrap timepicker在angular中取值并转化为时间戳
2017/06/13 Javascript
webpack打包后直接访问页面图片路径错误的解决方法
2017/06/17 Javascript
详解node.js中的npm和webpack配置方法
2018/01/21 Javascript
vue toggle做一个点击切换class(实例讲解)
2018/03/13 Javascript
详解如何创建并发布一个 vue 组件
2018/11/08 Javascript
koa2服务端使用jwt进行鉴权及路由权限分发的流程分析
2019/07/22 Javascript
微信小程序 动态修改页面数据及参数传递过程详解
2019/09/27 Javascript
TensorFlow.js 微信小程序插件开始支持模型缓存的方法
2020/02/21 Javascript
Vue.js中Line第三方登录api的实现代码
2020/06/29 Javascript
python生成密码字典的方法
2018/07/06 Python
python在回调函数中获取返回值的方法
2019/02/22 Python
python基于itchat模块实现微信防撤回
2019/04/29 Python
python实现基于朴素贝叶斯的垃圾分类算法
2019/07/09 Python
Python制作词云图代码实例
2019/09/09 Python
centos7中安装python3.6.4的教程
2019/12/11 Python
HTML5新表单元素_动力节点Java学院整理
2017/07/12 HTML / CSS
详解html5 postMessage解决跨域通信的问题
2018/08/17 HTML / CSS
美国高端婴童品牌:Hanna Andersson
2016/10/30 全球购物
德国价格合理的品牌商品购物网站:averdo
2019/03/21 全球购物
自荐信格式的六要素
2013/09/21 职场文书
大学生个人总结的自我评价
2013/10/05 职场文书
高三毕业典礼主持词
2014/03/27 职场文书
学生穿着不得体检讨书
2014/10/12 职场文书
小学生必读成语故事大全:送给暑假的你们
2019/07/09 职场文书