在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数组遍历的简单实现方法小结
Apr 27 Python
Python实现的文本简单可逆加密算法示例
May 18 Python
详解利用django中间件django.middleware.csrf.CsrfViewMiddleware防止csrf攻击
Oct 09 Python
Python基础教程之异常详解
Jan 10 Python
Python求一批字符串的最长公共前缀算法示例
Mar 02 Python
pandas如何处理缺失值
Jul 31 Python
Python统计分析模块statistics用法示例
Sep 06 Python
基于jupyter代码无法在pycharm中运行的解决方法
Apr 21 Python
python实现最短路径的实例方法
Jul 19 Python
Python TestSuite生成测试报告过程解析
Jul 23 Python
PyQt5多线程防卡死和多窗口用法的实现
Sep 15 Python
python 机器学习的标准化、归一化、正则化、离散化和白化
Apr 16 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中$_REQUEST、$_POST、$_GET的区别和联系小结
2011/11/23 PHP
深入密码加salt原理的分析
2013/06/06 PHP
PHP根据IP判断地区名信息的示例代码
2014/03/03 PHP
php实现跨域提交form表单的方法【2种方法】
2016/10/17 PHP
javascript prototype 原型链
2009/03/12 Javascript
原生js实现跨浏览器获取鼠标按键的值
2013/04/08 Javascript
关于eval 与new Function 到底该选哪个?
2013/04/17 Javascript
alert中断settimeout计时功能
2013/07/26 Javascript
JS实现控制表格行内容垂直对齐的方法
2015/03/30 Javascript
JavaScript基本的输出和嵌入式写法教程
2015/10/20 Javascript
Angular浏览器插件Batarang介绍及使用
2018/02/07 Javascript
React组件重构之嵌套+继承及高阶组件详解
2018/07/19 Javascript
详解JavaScript 为什么要有 Symbol 类型?
2019/04/03 Javascript
vue props对象validator自定义函数实例
2019/11/13 Javascript
js实现随机圆与矩形功能
2020/10/29 Javascript
[15:20]DOTA2-DPC中国联赛 正赛 Elephant vs Aster 选手采访
2021/03/11 DOTA
Python获取远程文件大小的函数代码分享
2014/05/13 Python
python实现简单ftp客户端的方法
2015/06/28 Python
浅谈python日志的配置文件路径问题
2018/04/28 Python
python3写的简单本地文件上传服务器实例
2018/06/04 Python
Python Learning 列表的更多操作及示例代码
2018/08/22 Python
Python实现简单的用户交互方法详解
2018/09/25 Python
详解Python静态网页爬取获取高清壁纸
2019/04/23 Python
Pytorch抽取网络层的Feature Map(Vgg)实例
2019/08/20 Python
django 配置阿里云OSS存储media文件的例子
2019/08/20 Python
python查看数据类型的方法
2019/10/12 Python
通过实例解析Python return运行原理
2020/03/04 Python
捷克时尚网上商店:OTTO
2018/03/15 全球购物
社区工作者思想汇报
2014/01/13 职场文书
安全教育感言
2014/03/04 职场文书
口才训练演讲稿范文
2014/09/16 职场文书
晚会开场白和结束语
2015/05/29 职场文书
七年级作文之游记
2019/12/11 职场文书
python如何做代码性能分析
2021/04/26 Python
Python socket如何解析HTTP请求内容
2022/02/12 Python
VUE递归树形实现多级列表
2022/07/15 Vue.js