某些时候可能有这种需求。在网页中点击一个链接或者一个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>等等。

django中怎样生成非HTML格式的内容。相关推荐

  1. 使用EndNote X9引用参考文献并在Word中修改生成的引文格式(编号、字体大小)GBT7714(numeric)

    使用endnote写论文引用参考文献并进行管理真的很方便,根据个人需求,碰到的一些小问题和解决方法如下: 1.修改word中插入后生成的引用文献的字体,首先是如下操作,可修改一种字体和大小,行间距,缩 ...

  2. Django中的日期和时间格式 DateTimeField

    创建django的model时,有DateTimeField.DateField和TimeField三种类型可以用来创建日期字段,其值分别对应着datetime().date().time()三中对象 ...

  3. django中实现mp3转wav(使用ffmpeg)

    在django中使用ffmpeg实现mp3格式的音频 转换成 wav格式.作适当改造,也可以在非django项目中使用,本文仅提供实现方案,作为参考. 使用场景: 在微信小程序中录音,调用讯飞的相关音 ...

  4. python对文件操作的相关函数_python文件操作的相关函数深入理解Django中内置的用户认证...

    前言 本文主要给大家介绍了关于Django中内置用户认证的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 认证登陆 在进行用户登陆验证的时候,如果是自己写代码,就必须要先查 ...

  5. 怎么将电脑中的声音录制成WAV格式

    平常生活中大家用电脑需不需要录音,比方说听歌的录一下音乐.聊天的时候录一下聊天语音.看视频的时候录一下演员对白等等.所以学会用电脑录音可以做很多事情,那么如何录制电脑内部播放的声音及音乐?这个时候就需 ...

  6. Django框架深入了解_05 (Django中的缓存、Django解决跨域流程(非简单请求,简单请求)、自动生成接口文档)(一)

    阅读目录 一.Django中的缓存: 前戏: Django中的几种缓存方式: Django中的缓存应用: 二.跨域: 跨域知识介绍: CORS请求分类(简单请求和非简单请求) 示例: 三.自动生成接口 ...

  7. 如何在Django中接收JSON格式的数据

    Django做了大量工作简化我们的Web开发工作, 这其中当然也包括接收来自客户端的数据这一普遍需求. 大部分时候,从客户端传入的数据主要是FORM的POST数据,和来自URL的GET数据, 在Dja ...

  8. 【接口文档】Django restful framework中自动生成API文档

    Django restful framework中自动生成API文档 一.Swagger概述 1.引言 当接口开发完成,紧接着需要编写接口文档.传统的接口文档使用Word编写,or一些接口文档管理平台 ...

  9. POI生成word文档,包括标题,段落,表格,统计图(非图片格式)

    Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能.POI为"P ...

最新文章

  1. 傻傻分不清的javascript运行机制
  2. 显示一个顶层的提示信息
  3. 基于ThinkPHP框架下登录登出权限控制(一).
  4. python编写爬虫的步骤-零基础写python爬虫之爬虫编写全记录
  5. 【“探探”为例】手把手教你用最少的代码实现各种“机器人”
  6. mob sdk vue 短信验证_短信接口那些事儿,你知道多少?
  7. android 根据bounds坐标进行点击操作_炫酷的Android时钟UI控件,隔壁产品都馋哭了...
  8. 【简报】kube框架结构-一个小型响应式CSS框架
  9. HttpClient连接池的连接保持、超时和失效机制
  10. 局域网通讯工具_五大核心开启工业通讯创新之门——西门子工业网络专家计划打造最强行业生态...
  11. 金融销售关键在于客户感受
  12. 【信号检测】基于matlab双稳态随机共振的参数寻优算法【含Matlab源码 1700期】
  13. 【情感识别】基于matlab PNN概率神经网络语音情感识别【含Matlab源码 544期】
  14. visio破解版安装2013
  15. html静态页面作业家乡网站设计—我的家乡-四川(9页) HTML+CSS+JavaScript 学生DW网页设计作业成品
  16. Python数据挖掘与分析——泰坦尼克号
  17. 人脸关键点检测的思考
  18. 21年GitHub上最牛批的《Java工程师成神之路》最新版文档!限时开源
  19. python编写beta计算器_|python编写计算器
  20. 流氓软件 巧压 怎么卸载?

热门文章

  1. Android动画及滑动事件冲突解决(转载)
  2. linux杂七杂八整理
  3. 详解 Visual C# 数据库编程
  4. SQL学习笔记之存储过程的编写
  5. dataframe常用操作_Pandas | Dataframe的merge操作,像数据库一样尽情join
  6. php函数从数组中取出指定的数目,PHP数组函数
  7. 24c语言程序设计是啥,《C语言程序设计》作业答案.docx
  8. java中break和continue的用法例子
  9. x299服务器芯片组,18核心炸裂!X299主板全集:为它真拼了
  10. catia如何整列加工_”模具加工“最全面的诠释,你真的都懂了吗?