在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对list列表结构中的值进行去重的方法总结
May 07 Python
transform python环境快速配置方法
Sep 27 Python
Python实现判断一个整数是否为回文数算法示例
Mar 02 Python
解决python 3 urllib 没有 urlencode 属性的问题
Aug 22 Python
python 正则表达式贪婪模式与非贪婪模式原理、用法实例分析
Oct 14 Python
基于python实现雪花算法过程详解
Nov 16 Python
Python3实现mysql连接和数据框的形成(实例代码)
Jan 17 Python
python+OpenCV实现图像拼接
Mar 05 Python
简单了解pytest测试框架setup和tearDown
Apr 14 Python
Python3.9新特性详解
Oct 10 Python
Python用户自定义异常的实现
Dec 25 Python
Python tensorflow卷积神经Inception V3网络结构
May 06 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
我的论坛源代码(五)
2006/10/09 PHP
yii添删改查实例
2015/11/16 PHP
在php中设置session用memcache来存储的方法总结
2016/01/14 PHP
PHP自定义函数判断是否为Get、Post及Ajax提交的方法
2017/07/27 PHP
浅谈laravel 5.6 安装 windows上使用composer的安装过程
2019/10/18 PHP
jquery 子窗口操作父窗口的代码
2009/09/21 Javascript
jquery ajax提交表单数据的两种方式
2009/11/24 Javascript
JSP跨iframe如何传递参数实现代码
2013/09/21 Javascript
Javascript delete 引用类型对象
2013/11/01 Javascript
Node.js编程中客户端Session的使用详解
2015/06/23 Javascript
Bootstrap布局组件教程之Bootstrap下拉菜单
2016/06/12 Javascript
基于MVC5和Bootstrap的jQuery TreeView树形控件(二)之数据支持json字符串、list集合
2016/08/11 Javascript
BootStrap CSS全局样式和表格样式源码解析
2017/01/20 Javascript
解决ie img标签内存泄漏的问题
2017/10/13 Javascript
vue.js中父组件调用子组件的内部方法示例
2017/10/22 Javascript
nodejs发送http请求时遇到404长时间未响应的解决方法
2017/12/10 NodeJs
javascript少儿编程关于返回值的函数内容
2018/05/27 Javascript
webpack4之SplitChunksPlugin使用指南
2018/06/12 Javascript
关于在vue 中使用百度ueEditor编辑器的方法实例代码
2018/09/14 Javascript
Node.js中的不安全跳转如何防御详解
2018/10/21 Javascript
详解关于html,css,js三者的加载顺序问题
2019/04/10 Javascript
js实现简单的无缝轮播效果
2020/09/05 Javascript
[05:14]辉夜杯主赛事第二日 RECAP精彩回顾
2015/12/27 DOTA
python中子类调用父类函数的方法示例
2017/08/18 Python
OpenCV-Python实现轮廓检测实例分析
2018/01/05 Python
详解Python中如何将数据存储为json格式的文件
2020/11/18 Python
python使用matplotlib的savefig保存时图片保存不完整的问题
2021/01/08 Python
欧洲有机婴儿食品最大的市场:Organic Baby Food(供美国和加拿大)
2018/03/28 全球购物
PHP高级工程师面试问题推荐
2013/01/18 面试题
毕业生机械建模求职信
2013/10/14 职场文书
警察思想汇报
2014/01/04 职场文书
五水共治一句话承诺
2014/05/30 职场文书
分公司负责人任命书
2014/06/04 职场文书
先进个人申报材料
2014/12/30 职场文书
运动员代表致辞
2015/07/29 职场文书
2016年优秀党员教师先进事迹材料
2016/02/29 职场文书