在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对字典进行排序实例
Sep 25 Python
零基础写python爬虫之urllib2使用指南
Nov 05 Python
python之Character string(实例讲解)
Sep 25 Python
Python pyinotify模块实现对文档的实时监控功能方法
Oct 13 Python
Python使用pyshp库读取shapefile信息的方法
Dec 29 Python
Python3 修改默认环境的方法
Feb 16 Python
Python 3.8 新功能全解
Jul 25 Python
Python 类,property属性(简化属性的操作),@property,property()用法示例
Oct 12 Python
详解python环境安装selenium和手动下载安装selenium的方法
Mar 17 Python
Python打印特殊符号及对应编码解析
May 07 Python
浅谈Python程序的错误:变量未定义
Jun 02 Python
用python删除文件夹中的重复图片(图片去重)
May 12 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
打造计数器DIY三步曲(下)
2006/10/09 PHP
PHP中的traits简单使用实例
2015/05/13 PHP
php封装的page分页类完整实例
2016/10/18 PHP
学习thinkphp5.0验证类使用方法
2017/11/16 PHP
jquery实现多级下拉菜单的实例代码
2013/10/02 Javascript
javascript阻止浏览器后退事件防止误操作清空表单
2013/11/22 Javascript
基于javascript简单实现对身份证校验
2021/01/25 Javascript
jQuery悬停文字提示框插件jquery.tooltipster.js用法示例【附demo源码下载】
2016/07/19 Javascript
BootStrap无限级分类(无限极分类封装版)
2016/08/26 Javascript
关于vue.js发布后路径引用的问题解决
2017/08/15 Javascript
基于Node.js实现压缩和解压缩的方法
2018/02/13 Javascript
Nodejs Express 通过log4js写日志到Logstash(ELK)
2018/08/30 NodeJs
详解小程序不同页面之间通讯的解决方案
2018/11/23 Javascript
微信小程序实现图片滚动效果示例
2018/12/05 Javascript
在vue-cli创建的项目中使用sass操作
2020/08/10 Javascript
vue 调用 RESTful风格接口操作
2020/08/11 Javascript
基于ajax实现上传图片代码示例解析
2020/12/03 Javascript
python实现猜数字游戏(无重复数字)示例分享
2014/03/29 Python
Python面向对象编程基础解析(二)
2017/10/26 Python
使用Python爬取最好大学网大学排名
2018/02/24 Python
神经网络(BP)算法Python实现及应用
2018/04/16 Python
使用matplotlib画散点图的方法
2018/05/25 Python
python3 写一个WAV音频文件播放器的代码
2019/09/27 Python
将labelme格式数据转化为标准的coco数据集格式方式
2020/02/17 Python
Python如何将模块打包并发布
2020/08/30 Python
Django搭建项目实战与避坑细节详解
2020/12/06 Python
详解如何用canvas画一个微笑的表情
2019/03/14 HTML / CSS
怎样声明子类
2013/07/02 面试题
一年级小学生评语
2014/04/22 职场文书
三万活动总结
2014/04/28 职场文书
教师对照四风自我剖析材料
2014/09/30 职场文书
普通党员个人剖析材料
2014/10/08 职场文书
承诺函格式模板
2015/01/21 职场文书
小学三年级作文之写景
2019/11/05 职场文书
Oracle安装TNS_ADMIN环境变量设置参考
2021/11/01 Oracle
「月刊Comic Alive」2022年5月号封面公开
2022/03/21 日漫