在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 22 Python
Python实现文件信息进行合并实例代码
Jan 17 Python
Python3实现转换Image图片格式
Jun 21 Python
Python logging模块用法示例
Aug 28 Python
Python用Try语句捕获异常的实例方法
Jun 26 Python
PyInstaller的安装和使用的详细步骤
Jun 02 Python
Python爬虫入门有哪些基础知识点
Jun 02 Python
PIL.Image.open和cv2.imread的比较与相互转换的方法
Jun 03 Python
如何使用python记录室友的抖音在线时间
Jun 29 Python
python 删除excel表格重复行,数据预处理操作
Jul 06 Python
Python实现迪杰斯特拉算法并生成最短路径的示例代码
Dec 01 Python
Python图片处理之图片裁剪教程
May 27 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
Views rows style模板重写代码
2011/05/16 PHP
PHP在线书签系统分享
2016/01/04 PHP
解析PHP的Yii框架中cookie和session功能的相关操作
2016/03/17 PHP
PHP实现超简单的SSL加密解密、验证及签名的方法示例
2017/08/28 PHP
PHP实现找出链表中环的入口节点
2018/01/16 PHP
php实现分页功能的详细实例方法
2019/09/29 PHP
推荐:极酷右键菜单
2006/11/29 Javascript
javascript parseInt() 函数的进制转换注意细节
2013/01/08 Javascript
JavaScript子类用Object.getPrototypeOf去调用父类方法解析
2013/12/05 Javascript
jQuery实现返回顶部效果的方法
2015/05/29 Javascript
原生js仿jquery animate动画效果
2016/07/13 Javascript
基于MVC+EasyUI的web开发框架之使用云打印控件C-Lodop打印页面或套打报关运单信息
2016/08/29 Javascript
vue模板语法-插值详解
2017/03/06 Javascript
axios发送post请求springMVC接收不到参数的解决方法
2018/03/05 Javascript
js实现敏感词过滤算法及实现逻辑
2018/07/24 Javascript
vue单页缓存方案分析及实现
2018/09/25 Javascript
小程序开发踩坑:页面窗口定位(相对于浏览器定位)(推荐)
2019/04/25 Javascript
详解vue中使用protobuf踩坑记
2019/05/07 Javascript
详解使用Python处理文件目录的相关方法
2015/10/16 Python
Linux下通过python访问MySQL、Oracle、SQL Server数据库的方法
2016/04/23 Python
从源码解析Python的Flask框架中request对象的用法
2016/06/02 Python
Python内置数据结构与操作符的练习题集锦
2016/07/01 Python
Django 开发环境配置过程详解
2019/07/18 Python
Python tkinter和exe打包的方法
2020/02/05 Python
python如何保存文本文件
2020/06/07 Python
html5 canvas-1.canvas介绍(hello canvas)
2013/01/07 HTML / CSS
美国饼干礼物和美食甜点购买网站:Cheryl’s
2020/05/28 全球购物
英文版餐饮运营管理求职信
2013/11/06 职场文书
12.4法制宣传日活动总结
2014/08/26 职场文书
2014年行政后勤工作总结
2014/12/06 职场文书
离婚协议书怎么写的
2014/12/14 职场文书
银行大堂经理培训心得体会
2016/01/09 职场文书
护士医德医风心得体会
2016/01/25 职场文书
Python中for后接else的语法使用
2021/05/18 Python
java固定大小队列的几种实现方式详解
2021/07/15 Java/Android
JAVA长虹键法之建造者Builder模式实现
2022/04/10 Java/Android