在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中标准库OS的常用方法总结大全
Jul 19 Python
简单了解Django模板的使用
Dec 20 Python
浅谈Python实现2种文件复制的方法
Jan 19 Python
python读取Excel实例详解
Aug 17 Python
让代码变得更易维护的7个Python库
Oct 09 Python
Python3爬虫使用Fidder实现APP爬取示例
Nov 27 Python
python实现电子产品商店
Feb 26 Python
在pycharm中实现删除bookmark
Feb 14 Python
python GUI库图形界面开发之PyQt5表单布局控件QFormLayout详细使用方法与实例
Mar 06 Python
django xadmin action兼容自定义model权限教程
Mar 30 Python
安装python3.7编译器后如何正确安装opnecv的方法详解
Jun 16 Python
使用ITK-SNAP进行抠图操作并保存mask的实例
Jul 01 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
yii2.0之GridView自定义按钮和链接用法
2014/12/15 PHP
thinkPHP3.1验证码的简单实现方法
2016/04/22 PHP
php微信公众号js-sdk开发应用
2016/11/28 PHP
JQUERY复选框CHECKBOX全选,取消全选
2008/08/30 Javascript
Jquery升级新版本后选择器的语法问题
2010/06/02 Javascript
基于javascript代码检测访问网页的浏览器呈现引擎、平台、Windows操作系统、移动设备和游戏系统
2015/12/03 Javascript
理解javascript模块化
2016/03/28 Javascript
JavaScript判断页面加载完之后再执行预定函数的技巧
2016/05/17 Javascript
谈谈PHP中相对路径的问题与绝对路径的使用
2016/08/16 Javascript
Node.js开发第三方微信公众平台
2017/06/05 Javascript
JS获取日期的方法实例【昨天,今天,明天,前n天,后n天的日期】
2017/09/28 Javascript
react MPA 多页配置详解
2019/10/18 Javascript
vue项目实现图片上传功能
2019/12/23 Javascript
[00:36]DOTA2上海特级锦标赛 Alliance战队宣传片
2016/03/04 DOTA
[59:35]DOTA2-DPC中国联赛定级赛 Aster vs DLG BO3第一场 1月8日
2021/03/11 DOTA
让python json encode datetime类型
2010/12/28 Python
Python操作Excel之xlsx文件
2017/03/24 Python
儿童学习python的一些小技巧
2018/05/27 Python
Python3自动签到 定时任务 判断节假日的实例
2018/11/13 Python
浅谈python中真正关闭socket的方法
2018/12/18 Python
利用python在excel里面直接使用sql函数的方法
2019/02/08 Python
python实现比较类的两个instance(对象)是否相等的方法分析
2019/06/26 Python
Python使用plt.boxplot() 参数绘制箱线图
2020/06/04 Python
python try...finally...的实现方法
2020/11/25 Python
paramiko使用tail实时获取服务器的日志输出详解
2020/12/06 Python
使用Python下载抖音各大V视频的思路详解
2021/02/06 Python
美国美妆网站:B-Glowing
2016/10/12 全球购物
Mytheresa美国官网:德国知名的女性奢侈品电商
2017/05/27 全球购物
Canal官网:巴西女性时尚品牌
2019/10/16 全球购物
乡镇网格化管理实施方案
2014/03/23 职场文书
工程部主管岗位职责
2015/02/12 职场文书
教师病假条范文
2015/08/17 职场文书
Python Socket编程详解
2021/04/25 Python
Python Django框架介绍之模板标签及模板的继承
2021/05/27 Python
德劲DE1105机评
2022/04/05 无线电
详解Mysql事务并发(脏读、不可重复读、幻读)
2022/04/29 MySQL