Django 如何使用视图动态输出 CSV 以及 PDF

Django 如何使用视图动态输出 CSV 以及 PDF

这一篇我们需要用到 pythoncsvreportLab 库,通过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-likeinterface."""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 作用于类似文件的对象,而 DjangoFileResponse 对象接受类似文件的对象。

打开我们的 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同名

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/362207.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

活用变量,让Postman的使用飞起来

在 Postman 中使用变量是一种非常强大的功能,它可以极大地增强 API 测试和开发的灵活性和效率。 Postman变量的类型 变量在 Postman 中可以在多个层次设置和使用,包括 全局变量环境变量集合变量局部变量(如在脚本中暂时创建的变量&#xf…

Clickhouse 的性能优化实践总结

文章目录 前言性能优化的原则数据结构优化内存优化磁盘优化网络优化CPU优化查询优化数据迁移优化 前言 ClickHouse是一个性能很强的OLAP数据库,性能强是建立在专业运维之上的,需要专业运维人员依据不同的业务需求对ClickHouse进行有针对性的优化。同一批…

想问一下stm32学习哪些东西才算入门并且能做项目?

STM32(所有的MCU都一样)归根结底只是一个工具,能做的事情也很多,如果只谈性能,不考虑稳定性等因素,那么103估计做个导弹控制器,火箭控制器都没有问题,阿波罗登月的主控主频才多少&am…

kafka 消费者 API 使用总结

前言 应用程序使用KafkaConsumer向Kafka订阅主题,并从订阅的主题中接收消息。不同于从其他消息系统读取数据,从Kafka读取数据涉及一些独特的概念和想法。如果不先理解这些概念,则难以理解如何使用消费者API。本文将先解释这些重要的概念&…

Attention步骤

一个典型的Attention思想包括三部分:Qquery、Kkey、Vvalue。 Q是query,是输入的信息;key和value成组出现,通常是原始文本等已有的信息;通过计算Q与K之间的相关性a,得出不同的K对输出的重要程度;…

数据结构与算法基础(王卓)--学习笔记

1 数据结构分类 1.1 逻辑结构分类 集合结构线性结构:线性表、栈、队列、串树形结构图形结构 1.2 物理结构分类 逻辑结构在计算机中的真正表示方式(又称为映射)称为物理结构,也可叫做存储结构 顺序存储结构:数组链…

百度安全X盈科全球数据合规服务中心:推进数据安全及合规智能化创新领域深化合作

6月19日,百度安全与盈科全球数据合规服务中心举行合作签约仪式,双方将充分发挥各自优势,在数据安全及合规智能化创新领域深化合作,在遵守国家法律法规和顺应市场规则的前提下,推动地方经济社会发展,促进企业…

【财经研究】并购重组的“不可能三角”

伴随着沪深IPO景气度下滑后,并购重组正受到市场的关注。 近期监管层正频频为并购重组发声 6月20日,证监会主席吴清在陆家嘴论坛上指出:“支持上市公司运用各种资本市场工具增强核心竞争力,特别是要发挥好资本市场并购重组主渠道作…

鸿蒙NEXT开发知识:工具常用命令—ohpm config

设置ohpm用户级配置项。 命令格式 ohpm config set <key> <value> ohpm config get <key> ohpm config delete <key> ohpm config list 说明 配置文件中信息以键值对<key> <value>形式存在。 功能描述 ohpm 从命令行和 .ohpmrc 文件中…

vue3 【提效】自动路由(含自定义路由) unplugin-vue-router 实用教程

不再需要为每一个路由编写冗长的 routes 配置啦&#xff0c;新建文件便可自动生成路由&#xff01; 使用方法 1. 安装 unplugin-vue-router npm i -D unplugin-vue-router2. 修改 vite 配置 vite.config.ts import VueRouter from unplugin-vue-router/viteplugins 中加入 V…

C++——时间戳转年月日时分秒格式

#include <stdio.h> #include <time.h> int main() { // 获取当前时间&#xff08;以秒为单位的时间戳&#xff09; time_t rawtime; time(&rawtime); // 将时间戳转换为本地时间&#xff08;struct tm&#xff09; struct tm * timeinfo localtime(&…

C++实现一个简单的Qt信号槽机制

昨天写这个文章《深入探讨C的高级反射机制&#xff08;2&#xff09;&#xff1a;写个能用的反射库》的时候就在想&#xff0c;是不是也能在这套反射逻辑的基础上&#xff0c;实现一个类似Qt的信号槽机制&#xff1f; Qt信号槽机制简介 所谓的Qt的信号槽&#xff08;Signals …

React 中的服务器渲染组件

在前后分离架构以前&#xff0c;所有的 Html 业务都是后端渲染&#xff0c;返回前前端显示&#xff0c;后端渲染把前后端逻辑耦合在一起&#xff0c;增大系统的复杂度&#xff0c;不易于扩展。React 中的 Server组件&#xff0c;准确的说是服务器进行渲染&#xff0c;无论是什么…

计算机网络 —— 应用层(FTP)

计算机网络 —— 应用层&#xff08;FTP&#xff09; FTP核心特性&#xff1a;运作流程&#xff1a; FTP工作原理主动模式被动模式 我门今天来看应用层的FTP&#xff08;文件传输协议&#xff09; FTP FTP&#xff08;File Transfer Protocol&#xff0c;文件传输协议&#x…

Electron快速入门(三):在(二)的基础上修改了一个文件夹做了个备忘录

Lingering Memories 诗绪萦怀 修改index.html <!--index.html--> <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><!-- https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP --><meta http-e…

检索增强生成RAG系列1--RAG的实现

大模型出现涌现能力之后&#xff0c;针对大模型的应用也如雨后春笋般。但是&#xff0c;在大模型真正落地之前&#xff0c;其实还需要做好最后一公里&#xff0c;而这个最后一公里&#xff0c;其中不同应用有着不同的方法。其中prompt、微调和RAG都是其中方法之一。本系列就是针…

抖音外卖服务商有哪些,盘点这几家正规服务商!

当前&#xff0c;抖音外卖的关注度不断上涨&#xff0c;抖音外卖服务商也逐渐成为了众多创业者心中的理想创业赛道。在此背景下&#xff0c;抖音外卖服务商的入局途径多次引发创业者热议&#xff0c;以抖音外卖服务商有哪些公司为代表的相关话题更是长期位居创业者问题榜单的前…

解决数据丢失问题的MacOS 数据恢复方法

每个人都经历过 Mac 硬盘或 USB 驱动器、数码相机、SD/存储卡等数据丢失的情况。我们中的一些人可能认为已删除或格式化的数据将永远丢失&#xff0c;因此就此作罢。对于 macOS 用户来说&#xff0c;当文件被删除时&#xff0c;垃圾箱已被清空&#xff0c;他们可能不知道如何恢…

【最新综述】基于伪标签的半监督语义分割

Semi-Supervised Semantic Segmentation Based on Pseudo-Labels: A Survey 摘要&#xff1a; 语义分割是计算机视觉领域的一个重要而热门的研究领域&#xff0c;其重点是根据图像中像素的语义对其进行分类。然而&#xff0c;有监督的深度学习需要大量数据来训练模型&#xff…

数据恢复篇:适用于Windows 的顶级数据恢复软件

适用于Windows的免费和付费的最佳数据恢复软件 **嘿&#xff0c;我要和大家一起泄露所有的测试工具。在评论中留下您的想法和最喜欢的选择&#xff01; 适用于 Windows 的最佳数据恢复软件 1.奇客数据恢复 奇客数据恢复版是Microsoft操作系统的顶级数据恢复软件应用程序之一&a…