资讯专栏INFORMATION COLUMN

Django 流式响应中文csv样例

only_do / 2452人阅读

摘要:在里,流式响应是个好东西可以快速节省内存地产生一个大型文件。目前项目里用于流式响应的一个是,用于改善跨系统通讯时用户产生的慢速的感觉。

在Django里,流式响应StreamingHttpResponse是个好东西,可以快速、节省内存地产生一个大型文件。

目前项目里用于流式响应的一个是Eventsource,用于改善跨系统通讯时用户产生的慢速的感觉。这个不细说了。

还有一个就是生成一个大的csv文件。

当Django进程处于gunicorn或者uwsgi等web容器中时,如果响应超过一定时间没有返回,就会被web容器终止掉,虽然我们可以通过加长web容器的超时时间来绕过这个问题,但是毕竟还是治标不治本。要根本上解决这个问题,Python的生成器、Django框架提供的StreamingHttpResponse这个流式响应很有帮助

而在csv中,中文的处理也至关重要,要保证用excel打开csv不乱码什么的。。为了节约空间,我就把所有代码贴到一起了。。实际使用按照项目的规划放置哈

上代码:

pythonfrom __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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/37515.html

相关文章

  • 9-django——restful设计风格

    摘要:设计风格协议与用户的通信协议,总是使用协议域名应该尽量将部署在专用域名之下,如果确定很简单,不会有进一步的扩展,可以考虑放在主域名之下。数据库中的表示记录同种数据的集合,所以中的名词也应该使用复数。 showImg(https://segmentfault.com/img/bVbdXlE?w=1560&h=913); RESTful Api设计风格 协议:API与用户的通信协议,总是使...

    scq000 评论0 收藏0
  • 关于PHP导出CSV文件的实现过程以及一些经常遇到的问题研究

    摘要:导出功能在管理后台算是比较常见的了。但是如果用来打开,超过行的数据都会看不见,这是程序的问题。本次导出数据量很大。原因数值显示精度为位造成精度丢失。 导出功能在管理后台算是比较常见的了。在实现导出表格类信息的功能时,可以选择两种实现方式: 导出为excel 导出为csv文件格式 用csv方式导出,则可以像导出txt一样,以文本流的方式进行流式处理,不但能导出海量信息,而且流式处理占...

    用户83 评论0 收藏0
  • 基于 java 注解的 csv 文件读写框架

    摘要:基于注解生成加签验签。是否写入头,建议第一次写入指定,避免中文乱码指定文件编码默认不进行字段排序无待写入的文件列表方法默认值说明必填创建实例,并且指定待读取文件路径。 csv 基于 java 注解生成加签验签 csv。 开源地址: github csv) 创作原由 以前觉得 csv 文件的多写非常简单,就懒得封装。 最近一个月写了两次 csv 文件相关的东西,发现要处理的细节还是有的,...

    Gemini 评论0 收藏0
  • django官方文档1.11编翻:首页

    摘要:源网页说明文档所有关于你应该且必须知道的。性能和优化概述的兼容性旨在兼容多种不同版本的支持的兼容性地理框架打算成为世界级的地理框架。其目标是尽可能简单地构建应用程序并利用空间使能数据的功能。 源网页:https://docs.djangoproject.co... django说明文档 所有关于django你应该且必须知道的。 第一步 你是否django编程新手,那就从此开始!从零开始...

    Michael_Lin 评论0 收藏0
  • Django REST FrameWork中文教程2:请求和响应

    摘要:请注意,我们不再明确地将我们的请求或响应明确绑定到给定的内容类型。这允许返回完全可浏览网页的表示。中文文档目录中文教程序列化中文教程请求和响应中文教程基于类的视图中文教程验证和权限中文教程关系和超链接中文教程中文教程模式和客户端库 从这一点开始,我们将真正开始覆盖REST框架的核心。我们来介绍几个基本的构建块。 请求对象REST框架引入了Request扩展常规的对象HttpReques...

    winterdawn 评论0 收藏0

发表评论

0条评论

only_do

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<