在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使用mysqldb连接数据库操作方法示例详解
Dec 03 Python
Python实现list反转实例汇总
Nov 11 Python
python实现计算倒数的方法
Jul 11 Python
用python实现刷点击率的示例代码
Feb 21 Python
利用Python半自动化生成Nessus报告的方法
Mar 19 Python
python 将字符串中的数字相加求和的实现
Jul 18 Python
浅谈Pytorch torch.optim优化器个性化的使用
Feb 20 Python
Python Websocket服务端通信的使用示例
Feb 25 Python
keras:model.compile损失函数的用法
Jul 01 Python
Python限制内存和CPU使用量的方法(Unix系统适用)
Aug 04 Python
python3爬虫中多线程的优势总结
Nov 24 Python
Python趣味挑战之给幼儿园弟弟生成1000道算术题
May 28 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&mysql(一)
2006/10/09 PHP
php定时计划任务的实现方法详解
2013/06/06 PHP
Javascript 跨域访问解决方案
2009/02/14 Javascript
JavaScript 继承机制的实现(待续)
2010/05/18 Javascript
麻雀虽小五脏俱全 Dojo自定义控件应用
2010/09/04 Javascript
基于jQuery架构javascript基础体系
2011/01/01 Javascript
浅析hasOwnProperty方法的应用
2013/11/20 Javascript
IE8中动态创建script标签onload无效的解决方法
2014/12/22 Javascript
学习JavaScript设计模式之观察者模式
2020/04/22 Javascript
使用jQuery加载html页面到指定的div实现方法
2016/07/13 Javascript
Js操作DOM元素及获取浏览器高宽的简单方法
2016/09/08 Javascript
微信小程序 教程之注册页面
2016/10/17 Javascript
JS数字千分位格式化实现方法总结
2016/12/16 Javascript
JQuery统计input和textarea文字输入数量(代码分享)
2016/12/29 Javascript
JavaScript仿微信打飞机游戏
2020/07/05 Javascript
微信小程序新增的拖动组件movable-view使用教程
2017/05/20 Javascript
mui上拉加载更多下拉刷新数据的封装过程
2017/11/03 Javascript
vue.js整合mint-ui里的轮播图实例代码
2017/12/27 Javascript
Vue中的methods、watch、computed的区别
2018/11/26 Javascript
Vue设置长时间未操作登录自动到期返回登录页
2020/01/22 Javascript
vue+render+jsx实现可编辑动态多级表头table的实例代码
2020/04/01 Javascript
antd form表单数据回显操作
2020/11/02 Javascript
[59:15]EG vs LGD 2018国际邀请赛淘汰赛BO3 第一场 8.26
2018/08/29 DOTA
Python 中pandas.read_excel详细介绍
2017/06/23 Python
python学习之hook钩子的原理和使用
2018/10/25 Python
对django的User模型和四种扩展/重写方法小结
2019/08/17 Python
python正则表达式re.match()匹配多个字符方法的实现
2021/01/27 Python
HTML5中语义化 b 和 i 标签
2008/10/17 HTML / CSS
世界上最大的高分辨率在线图片库:Alamy
2018/07/07 全球购物
怎样创建、运行java程序
2014/08/01 面试题
RealTek面试题
2016/06/28 面试题
小区门卫值班制度
2014/01/24 职场文书
2014年办公室工作总结范文
2014/11/12 职场文书
公司辞职信模板
2015/05/13 职场文书
格列佛游记读书笔记
2015/06/30 职场文书
Golang使用Panic与Recover进行错误捕获
2022/03/22 Golang