在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程序设计入门(1)基本语法简介
Jun 13 Python
python制作爬虫并将抓取结果保存到excel中
Apr 06 Python
python微信跳一跳系列之自动计算跳一跳距离
Feb 26 Python
Python2.7.10以上pip更新及其他包的安装教程
Jun 12 Python
caffe binaryproto 与 npy相互转换的实例讲解
Jul 09 Python
Python 字符串换行的多种方式
Sep 06 Python
pygame游戏之旅 如何制作游戏障碍
Nov 20 Python
spark dataframe 将一列展开,把该列所有值都变成新列的方法
Jan 29 Python
Python面向对象进阶学习
May 21 Python
python并发编程多进程 互斥锁原理解析
Aug 20 Python
PyTorch实现ResNet50、ResNet101和ResNet152示例
Jan 14 Python
使用tensorflow DataSet实现高效加载变长文本输入
Jan 20 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下使用curl模拟用户登陆的代码
2010/09/10 PHP
php ci框架中加载css和js文件失败的解决方法
2014/03/03 PHP
ThinkPHP模板范围判断输出In标签与Range标签用法详解
2014/06/30 PHP
php数组操作之键名比较与差集、交集赋值的方法
2014/11/10 PHP
php中数据库连接方式pdo和mysqli对比分析
2015/02/25 PHP
php返回相对时间(如:20分钟前,3天前)的方法
2015/04/14 PHP
php发送html格式文本邮件的方法
2015/06/10 PHP
Linux+Nginx+MySQL下配置论坛程序Discuz的基本教程
2015/12/23 PHP
laravel 实现登陆后返回登陆前的页面方法
2019/10/03 PHP
可拖动窗口,附带鼠标控制渐变透明,开启关闭功能
2006/06/26 Javascript
让插入到 innerHTML 中的 script 跑起来的实现代码
2006/07/01 Javascript
一个用js实现控制台控件的代码
2007/09/04 Javascript
JavaScript 加号(+)运算符号
2009/12/06 Javascript
JS 显示当前日期与时间的代码
2010/03/24 Javascript
jquery插件之easing 动态菜单
2010/08/21 Javascript
浅析JavaScript动画
2015/06/10 Javascript
kindeditor编辑器点中图片滚动条往上顶的bug
2015/07/05 Javascript
基于angular实现模拟微信小程序swiper组件
2017/06/11 Javascript
Vue项目中如何引入icon图标
2018/03/28 Javascript
[01:02:26]DOTA2-DPC中国联赛 正赛 SAG vs RNG BO3 第二场 1月18日
2021/03/11 DOTA
Python多线程编程(七):使用Condition实现复杂同步
2015/04/05 Python
Python matplotlib画图实例之绘制拥有彩条的图表
2017/12/28 Python
Python爬虫爬取一个网页上的图片地址实例代码
2018/01/16 Python
使用memory_profiler监测python代码运行时内存消耗方法
2018/12/03 Python
python操作小程序云数据库实现简单的增删改查功能
2019/06/06 Python
python 环境搭建 及python-3.4.4的下载和安装过程
2019/07/20 Python
Selenium及python实现滚动操作多种方法
2020/07/21 Python
css3实现背景颜色渐变让图片不再是唯一的实现方式
2012/12/18 HTML / CSS
如何用SQL语句进行模糊查找
2015/09/25 面试题
汽车维修专业毕业生的求职信分享
2013/12/04 职场文书
小学教师师德反思
2014/02/03 职场文书
大学拉赞助协议书范文
2014/09/26 职场文书
2014年党风廉政工作总结
2014/12/03 职场文书
幼儿园园长工作总结2015
2015/05/25 职场文书
2015年乡镇纪委工作总结
2015/05/26 职场文书
摩登时代观后感
2015/06/03 职场文书