django中怎样生成非HTML格式的内容。

某些时候可能有这种需求。在网页中点击一个链接或者一个button希望返回一张图片、一个pdf文档、一个csv文档等而非HTML。

在diango中非常easy做到这些。django中的view用来接收http request并返回web response。

通常情况下,返回的内容为HTML,但其可以返回的不只如此。还可以是上述图片、pdf文件等等。返回非HTML形式的内容的关键在于HttpResponse这个类,尤其是mimetype这个參数,通过将此參数设置为不同的值可以提示浏览器view返回了不同格式的内容。

比方,想要返回图片内容,只需读如一张图片,然后在HttpResponse中指明图片的mimetype并将图片内容作为还有一參数response给浏览器,浏览器可以自己主动正确的显示图片内容。

from django.http import HttpResponsedef my_image(request):image_data = open("/path/to/my/image.png", "rb").read()return HttpResponse(image_data, mimetype="image/png")
另外一个须要特别注意的的是HttpResponse对象实现了Python的标准“file-like-object”API。也即能够将HttpResponse当做文件使用。
样例:
生成CSV格式的内容

import csv
from django.http import HttpResponse# Number of unruly passengers each year 1995 - 2005. In a real application
# this would likely come from a database or some other back-end data store.
UNRULY_PASSENGERS = [146,184,235,200,226,251,299,273,281,304,203]def unruly_passengers_csv(request):# Create the HttpResponse object with the appropriate CSV header.response = HttpResponse(mimetype='text/csv')response['Content-Disposition'] = 'attachment; filename=unruly.csv'# Create the CSV writer using the HttpResponse as the "file."writer = csv.writer(response)writer.writerow(['Year', 'Unruly Airline Passengers'])for (year, num) in zip(range(1995, 2006), UNRULY_PASSENGERS):writer.writerow([year, num])return response
须要注意的几点:
1.HttpResponse中mimetype指定为了'text/csv'告知浏览器返回的文档是CSV文件。
2.HttpResponse设置了另外一个參数Content-Disposition当中attachment告知浏览器保存返回的文档而非显示其内容,filename指明了返回文档的名字,改名字可随意指定。


3.由于csv的writer方法期望一个文件类型的对象作为參数,而HttpResponse实例能够当做文件使用,所以能够直接在csv模块的writer方法中将HttpResponse作为參数。


4.writer.writerow方法负责往文件里写入一行内容。

上述方法是返回非HTML格式内容的通用模式,也即:创建一个特定MIME Type的HttpResponse。将其传递给以文件为參数产生特定格式的文档的方法。之后返回该response。

生成PDF格式的内容

from reportlab.pdfgen import canvas
from django.http import HttpResponsedef hello_pdf(request):# Create the HttpResponse object with the appropriate PDF headers.response = HttpResponse(mimetype='application/pdf')response['Content-Disposition'] = 'attachment; filename=hello.pdf'# Create the PDF object, using the response object as its "file."p = canvas.Canvas(response)# Draw things on the PDF. Here's where the PDF generation happens.# See the ReportLab documentation for the full list of functionality.p.drawString(100, 100, "Hello world.")# Close the PDF object cleanly, and we're done.p.showPage()p.save()return response
流程基本同上,须要注意的几点:
1.此处使用了 application/pdf MIME type告知浏览器返回的是PDF文件。而非HTML。否则浏览器会将其作为普通HTML内容处理。
2.canvas.Canvas方法期望一个file-like的对象作为參数,将HttpResponse传递给该方法。


3.使用Canvas实例的方法绘制PDF文档,调用showPage()方法和save()方法(否则会产生损坏的pdf文档)。
4.最后返回该HttpResponse实例

生成更为复杂的PDF文档,这里使用了cStringIO库来暂时存放PDF文件

from cStringIO import StringIO
from reportlab.pdfgen import canvas
from django.http import HttpResponsedef hello_pdf(request):# Create the HttpResponse object with the appropriate PDF headers.response = HttpResponse(mimetype='application/pdf')response['Content-Disposition'] = 'attachment; filename=hello.pdf'temp = StringIO()# Create the PDF object, using the StringIO object as its "file."p = canvas.Canvas(temp)# Draw things on the PDF. Here's where the PDF generation happens.# See the ReportLab documentation for the full list of functionality.p.drawString(100, 100, "Hello world.")# Close the PDF object cleanly.p.showPage()p.save()# Get the value of the StringIO buffer and write it to the response.response.write(temp.getvalue())return response
其它可能的格式
实质上。不论什么能够写文件的Python库都可与Django的HttpResponse结合用以返回特定格式的内容,如ZIP文件、动态图片、图表、XLS文件等等。

最后在看一个返回xls文件的样例

from django.http import HttpResponse
import xlwt
def viewXls(request):response = HttpResponse(mimetype='application/vnd.ms-excel')  response['Content-Disposition'] = 'attachment; filename=request.xls'    book = xlwt.Workbook(encoding='utf8')   sheet = book.add_sheet('untitled')for row, column, value in ((0,0,1),(0,1,2),(1,0,3),(1,1,4)) sheet.write(int(row),int(column),value)book.save(response)return response
流程同上,不在凝视。

另外。须要特别注意的是,这里的request必须是通过表单提交才干正确返回特定格式的内容,若要是通过ajax方式发起的request则返回的内容会被当做文本串处理,而不能被浏览器解释为特定内容。
比方:
$.ajax({url:"{% url 'mycitsm.views.viewXls' %}",data:postData,type:"POST",success:function(result){},});
//是不能够的,而要使用例如以下的表单提交才干够:
var form = $("#xlsForm");
form.attr({action:"{% url 'mycitsm.views.returnXls' %}",method:"POST"        
});
form.submit();
讲到这里有必要记录一下开发过程中遇到的一个问题,也即将表单内容序列化为字符串的问题。


有时需将表单中的全部内容序列化为键值对构成的串做为一个总体进行URL參数传递,并且须要对值中包括的特殊字符进行编码。比方有例如以下表单:

<form><div><input type="text" name="a" value="1" id="a" /></div><div><input type="text"  value="2" id="b" /></div><div><input type="hidden" name="c" value="3" id="c" /></div><div><textarea name="d" rows="8" cols="40">4</textarea></div><div><select name="e"><option value="5" selected="selected">5</option><option value="6">6</option><option value="7">7</option></select></div><div><input type="checkbox" name="f" value="8" id="f" /></div><div><input type="submit" name="g" value="Submit" id="g" /></div></form>$('form').submit(function() {alert($(this).serialize());return false;});
#能够输出
a=1&c=3&d=4&e=5
为什么第二个text类型的input的值还有checkbox类型的input的值以及submit类型的input没有被序列化呢?这是由于假设要表单元素的值包括到序列字符串中,元素必须使用 name 属性。

而第二个text类型的input无name属性。checkbox类型的input有一个并没有被checked所以……。

serialize()仅仅会将”成功的控件“序列化为字符串。

假设不使用button来提交表单。则不正确提交button的值序列化,所以submit类型的input没有被序列化。


当然除了直接对整个form序列化外还可对已选取的个别表单元素的jQuery对象序列化。如<input>,<textarea>等等。





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

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

相关文章

Window.document对象

一、找到元素&#xff1a; docunment.getElementById("id")&#xff1b;根据id找&#xff0c;最多找一个&#xff1b; var a docunment.getElementById("id");将找到的元素放在变量中&#xff1b; docunment.getElementsByName("name")&am…

C# 读写文件从用户态切到内核态,到底是个什么流程?

一&#xff1a;背景 1. 一个很好奇的问题我们在学习 C# 的过程中&#xff0c;总会听到一个词叫做 内核态 &#xff0c;比如说用 C# 读写文件&#xff0c;会涉及到代码从 用户态 到 内核态 的切换&#xff0c;用 HttpClient 获取远端的数据&#xff0c;也会涉及到 用户态 到 内核…

C语言九十四之请编写函数fun(char *str, int n),其功能是:使字符串str的前导*号不能多余n个,若多于n个,则删除多余的*号,若少于或等于n个,则不做处理。

📃个人主页:个人主页 🔥系列专栏:C语言试题200例目录 💬推荐一款刷算法、笔试、面经、拿大公司offer神器 👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 规定输入的…

【土地评价与土地管理】案例:某地区土地农业利用潜力评价

文章目录 一、确定评价单元二、拟定潜力评价系统表、确定指标权重三、指标评价四、评定潜力等级五、得出潜力评价结果一、确定评价单元 土地潜力评价单元采用地块作为评价单元,此地块是建立在土地利用现状的基础上, 综合土地的自然属性来确定,评价单元界线与土地现有界线基本…

WIKIOI 1519 过路费

1519 过路费 1519 过路费 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 大师 Master 题解 题目描述 Description 在某个遥远的国家里&#xff0c;有 n个城市。编号为 1,2,3,…,n。这个国家的政府修建了m 条双向道路&#xff0c;每条道路连接着两个城市。政府规定从城市…

code point,code unit

2019独角兽企业重金招聘Python工程师标准>>> 从一段API描述谈起&#xff1a; 在String的length的API中描述是这样的&#xff01; lengthpublic int length() Returns the length of this string. The length is equal to the number of 16-bit Unicode characters i…

Android之解决JsonObject里面的JsonArray数据会有斜杠问题

1、问题 本地保存了多个json格式的字符串 {"event":"sdk_ad_request_status","timestamp":1640180549231,"ad_app_id":"10104","pool_test":0,"ad_type":0,"ad_request_time":0,"requ…

【土地评价与土地管理】案例:兰州市榆中县农用地分等

文章目录 一、资料收集二、确定标准耕作制度、基准作物、指定作物、光温(气候生产潜力)三、划分指标区,确定分等因素及权重四、编制“指定作物-分等因素-自然质量分”记分规则表五、绘制分等因素分值图,划分分等单元六、计算农用地自然质量分七、计算自然质量等指数八、计算…

.NET7之MiniAPI(特别篇) :Preview5优化了JWT验证(下)

Preview5对策略验证的方式没有改变&#xff0c;只不过内置了Token的生成&#xff0c;和《.NET6之MiniAPI(十)&#xff1a;基于策略的身份验证和授权》的验证方式基本相同&#xff0c;都是生成和验证使用的验证参数要一致&#xff0c;用继承AuthorizationHandler的子类来作每次请…

业务多变的公司上云后蒸蒸日上

一、云服务器与传统服务器的对比 1&#xff09;、传统服务器 传统服务器是一个独立的硬件设备,可以理解成是一台放在机房的高配置电脑,可根据需求安装各种操作系统以及配置各种环境,性能也比较强大。 2&#xff09;、云服务器 云服务器是构建在硬件服务器集群之上&#xff0c;…

2016福州大学软件工程第四次团队作业-系统设计成绩汇总

第四次团队作业——系统设计打分统计结果如下&#xff1a; 学号组别团队分数贡献比例个人分数031401433606notconnected141613.83031402606606notconnected141413.33031402618606notconnected141814.34031402629606notconnected141413.33031402631606notconnected141914.590314…

[转]在C#中像Python一样编写TensorFlow机器学习代码

机器学习是一个令人激动人心的领域&#xff0c;一直有新的技术突破。研究人员不断推动机器智能的提升&#xff0c;教机器如何听说读写——这些曾经是我们人类专属的技能。机器学习的首选语言是Python&#xff0c;最受欢迎的库是Google的TensorFlow。几乎所有的代码示例都是用Py…

【土地评价与土地管理】教案 第一章:土地评价要素的选择

文章目录 1.1 土地构成要素与其农业利用1、光能条件2、热量条件3、降水条件1.1 土地构成要素与其农业利用 1、光能条件  光能是绿色植物进行光合作用和生物运动发展的主要能源  太阳辐射、日照时数  太阳辐射量随地域和季节变化较大,导致了土地利用的多样性和土地资源…

Blazor University (33)表单 —— EditContext、FieldIdentifiers

原文链接&#xff1a;https://blazor-university.com/forms/editcontext-fieldidentifiers-and-fieldstate/EditContext、FieldIdentifiers 和 FieldState请注意&#xff0c;对于那些希望了解 Blazor 如何“在后台”工作的人来说&#xff0c;这是一个高级主题。无需了解此信息即…

Flutter之Container的宽度如何设置为手机屏幕宽度

1、问题 Container的宽度如何设置为手机屏幕宽度 2、解决办法 width: MediaQuery.of(context).size.width,Row(children: [Container(height: 40,width: MediaQuery.of(context).size.width,// width: double.infinity,color: Colors.red,child: Row(children: [Containe…

团队项目开发篇章8

例会时间&#xff1a;2016.11.3 整理&#xff1a;姬索肇 例会照片 每个人的工作 任务分配 我们今天与王鹿鸣学长和李云涛学长针对团队开发过程中遇到的问题进行了讨论&#xff0c;非常感谢学长们的热心帮助&#xff0c;同时我们也被他们强大的编程能力所折服~ 在这里为学长们点…

MongoDB常用命令

启动MongoDB$mongod --fork --logpath/data/log/r3.log--fork 允许mongod后台运行&#xff0c;但是必须指定日志记录文件路径&#xff08;Enables a daemon mode that runs the mongos process in the background.&#xff09;--logpath 指定日志记录文件路径 导出Collections$…

【地理信息系统GIS】教案(七章全)第一章:地理信息系统概述

文章目录 第一节 GIS基本概念第二节 GIS的组成第三节 GIS的功能第四节 GIS的发展第一节 GIS基本概念 1.1 GIS基本概念 1、信息 是用文字、数字、符号、语言、图象、图形等介质来表达事件、事物或现象等的内容、数量和特征,从而向人们(或系统)提供关于现实世界新的事实和知…

C# 读写ini文件 保存信息

/// <summary> /// 获取本地信息 /// </summary> /// <returns></returns> private List<MHistoryKewWord> GetLocalHistoryKeyWords(){List<MHistoryKewWord> list new List<MHistoryKewWord>();var fs new FileStream("dat…

表达式的动态解析和计算,Flee用起来真香

前言在很多项目中经常会出现需要动态解析表达式和计算的场景&#xff0c;比如一些自动审核规则&#xff0c;或者是一些变量的值通过维护的公式在运行过程中动态算出&#xff1b;由于场景需求&#xff0c;都需要比较灵活的配置对应的表达式&#xff0c;然后希望在需要的时候能根…