Django 如何使用视图动态输出 CSV 以及 PDF
toyiye 2024-09-19 04:44 2 浏览 0 评论
Django 如何使用视图动态输出 CSV 以及 PDF
这一篇我们需要用到 python 的 csv 和 reportLab 库,通过django视图来定义输出我们需要的 csv 或者 pdf 文件。
csv文件
打开我们的视图文件 testsite/members/views.py 。新增一个视图方法:
import csv # 导入python的csv包
def some_view(request):
# Create the HttpResponse object with the appropriate CSV header.
response = HttpResponse(
content_type="text/csv",
headers={"Content-Disposition": 'attachment; filename="somefilename.csv"'},
)
writer = csv.writer(response)
writer.writerow(["第一行", "Foo", "Bar", "Baz"])
writer.writerow(["第二行", "A", "B", "C", '"Testing"', "Here's a quote"])
return response
在上面代码里面
- ? 响应会获得一个特殊的 MIME 类型 text/csv。会告诉浏览器该文档是一个 CSV 文件,而不是 HTML 文件。
- ? 响应会获得一个附加 Content-Disposition 标头,其中包含 CSV 文件的名称。此文件名是任意的;您可以随意命名。浏览器会在“另存为…”对话框中使用它。
- ? response 您可以通过将作为第一个参数传递给 来挂接 CSV 生成 API csv.writer 。该 csv.writer 函数需要一个类似文件的对象,并且 HttpResponse 对象符合要求。
- ? 对于 CSV 文件中的每一行,调用 writer.writerow ,并将一个 可迭代的传递给它。
- ? CSV 模块会为您处理引号,因此您不必担心转义带引号或逗号的字符串。传递 writerow() 您的原始字符串,它会做正确的事情。
然后打开我们的路由文件 testsite/members/urls.py ,添加一个路由:
path('csv/', views.some_view, name='csv'),
访问我们的http://127.0.0.1:8000/members/csv地址,可以得到一个csv文件。如下图所示:
打开文件里面就是我们自定义格式的 csv 。
如果当我们在使用流式传输大型 csv 文件的时候,在处理生成非常大响应的视图时,就要改用 Django StreamingHttpResponse 为啥要改成这个呢
举个例子,通过流式传输需要很长时间才能生成的文件,您可以避免负载平衡器在服务器生成响应时丢弃可能超时的连接。
在下面例子中,我们就可以充分利用 Python 生成器来高效处理大型 CSV 文件的组装和传输,打开 testsite/members/views.py 文件:
import csv
from django.http import StreamingHttpResponse
class Echo:
"""An object that implements just the write method of the file-like
interface.
"""
def write(self, value):
"""Write the value by returning it, instead of storing in a buffer."""
return value
def some_streaming_csv_view(request):
"""A view that streams a large CSV file."""
rows = (["Row {}".format(idx), str(idx)] for idx in range(65536))
pseudo_buffer = Echo()
writer = csv.writer(pseudo_buffer)
return StreamingHttpResponse(
(writer.writerow(row) for row in rows),
content_type="text/csv",
headers={"Content-Disposition": 'attachment; filename="somefilename.csv"'},
)
添加我们的路由,打开我们的 testsite/members/urls.py 文件:
path('csv-stream/', views.some_streaming_csv_view, name='csv'),
浏览器访问http://127.0.0.1:8080/members/csv-stream流式输出文件:
打开这个文件如图示:
当然还一种方式来生成csv,通过django的模版系统。下面跟着代码来试一下这种方法:
依然还是先打开视图文件 testsite/members/views.py :
from django.http import HttpResponse
from django.template import loader
def some_view(request):
response = HttpResponse(
content_type="text/csv",
headers={"Content-Disposition": 'attachment; filename="somefilename.csv"'},
)
csv_data = (
("First row", "Foo", "Bar", "Baz"),
("Second row", "A", "B", "C", '"Testing"', "Here's a quote"),
)
t = loader.get_template("my_template_name.txt")
c = {"data": csv_data}
response.write(t.render(c))
return response
添加我们的路由,打开我们的 testsite/members/urls.py 文件:
path('csv-template/', views.some_view_tem, name='csv'),
在当前目录下面的 templates 文件夹创建我们的模板文件 my_template_name.txt :
{% for row in data %}"{{ row.0|addslashes }}", "{{ row.1|addslashes }}", "{{ row.2|addslashes }}", "{{ row.3|addslashes }}", "{{ row.4|addslashes }}"
{% endfor %}
浏览器访问http://127.0.0.1:8080/members/csv-template流式输出文件:
就可以得到我们自定义模板的 csv 文件。
二、如何创建 PDF 文件
由于 python 拥有出色的开源 ReportLab Python PDF 库,使得我们动态生成 pdf 非常有优势。
首先我们安装ReportLab 库:
py -m pip install reportlab
我们可以看到下列结果:
使用django动态生成pdf的关键在于ReportLab API作用于类似文件的对象,而Django的FileResponse对象接受类似文件的对象。
打开我们的 testsite/members/views.py 视图文件:
import io
from django.http import FileResponse
from reportlab.pdfgen import canvas
def some_view_pdf(request):
buffer = io.BytesIO()
p = canvas.Canvas(buffer)
p.drawString(100, 100, "Hello world.")
p.showPage()
p.save()
buffer.seek(0)
return FileResponse(buffer, as_attachment=True, filename="hello.pdf")
代码里面我讲一下大概的含义:
- ? 响应将 根据文件扩展名 自动设置 MIME 类型 application/pdf 。这就告诉浏览器该文档是 PDF 文件,而不是 HTML 文件或通用 application/octet-stream 二进制内容。
- ? 当 as_attachment=True 传递给时 FileResponse ,它会设置适当的 Content-Disposition 标头,并告诉网络浏览器弹出一个对话框,提示/确认如何处理文档,即使机器上设置了默认值。如果as_attachment 省略该参数,浏览器将使用已配置用于 PDF 的任何程序/插件来处理 PDF。
- ? filename 定义你需要输出的 pdf 名字。浏览器将在“另存为…”对话框中使用它。
- ? 可以挂接到 ReportLab API :作为第一个参数传递的相同缓冲区 canvas.Canvas 可以提供给该类 FileResponse 。
- ? 所有后面的 PDF 生成方法均在 PDF 对象(上面例子中为p)上调用,而不是在 上调用 buffer。
- ? showPage() 最后,调用并 save() 查看 PDF 文件非常重要。
添加我们的路由,打开我们的 testsite/members/urls.py 文件:
path('csv-stream/', views.some_streaming_csv_view, name='csv'),
浏览器访问http://127.0.0.1:8080/members/pdf:
打开pdf文件,就可以看到我们自动输出的pdf文件:
ReportLab并不是线程安全的。
所以一些小伙伴在构建 PDF 生成 Django 视图时出现的奇怪问题,这些视图就是由于许多人同时访问造成的。
三、总结
虽然 csv 文件和 pdf 文件的动态生成技术很常见,也是业务中经常用到的,我们文中所用到的只是其中的某个包,比如 reportlab 。
在 django 官方的 packages 有更详细不同包的比较,以及他们的使用方式,https://djangopackages.org/grids/g/pdf/。
利用这两个工具结合我们的 django 视图,就完全的能和我们自己开发的系统结合起来了。
根据相应的显示字段动态生成一切我们想要的文件,是非常方便的。
– 欢迎点赞、关注、转发、收藏【我码玄黄】,gonghao同名
相关推荐
- 为何越来越多的编程语言使用JSON(为什么编程)
-
JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...
- 何时在数据库中使用 JSON(数据库用json格式存储)
-
在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...
- MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)
-
前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...
- JSON对象花样进阶(json格式对象)
-
一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...
- 深入理解 JSON 和 Form-data(json和formdata提交区别)
-
在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...
- JSON 语法(json 语法 priority)
-
JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...
- JSON语法详解(json的语法规则)
-
JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...
- MySQL JSON数据类型操作(mysql的json)
-
概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...
- JSON的数据模式(json数据格式示例)
-
像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...
- 前端学习——JSON格式详解(后端json格式)
-
JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...
- 什么是 JSON:详解 JSON 及其优势(什么叫json)
-
现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...
- PostgreSQL JSON 类型:处理结构化数据
-
PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...
- JavaScript:JSON、三种包装类(javascript 包)
-
JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...
- Python数据分析 只要1分钟 教你玩转JSON 全程干货
-
Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...
- 比较一下JSON与XML两种数据格式?(json和xml哪个好)
-
JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- r语言矩阵 (127)
- browsererror (114)
- exportexcel (119)
- cv2.bitwise_not (137)
- dump命令 (128)
- es6concat (126)
- heapify (127)
- java.security.egd (130)
- javax.annotation (117)
- jsstringsplit (117)
- js数字 (115)
- maven编译 (132)
- mysqlleft (128)
- nodejsbuffer (149)
- org.apache.commons.httpclient (126)
- org.jsoup (141)
- org.springframework.web (128)
- robotframework-ride (115)
- setnocounton (141)
- socket.gethostbyname (122)
- sqlmid (121)
- time.strptime (133)
- vscode格式化 (125)
- win32con (129)
- window.localstorage (126)