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

def 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 HttpResponse def 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 HttpResponse def 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. Django中反向生成models

    我们在展示django ORM反向生成之前,我们先说一下怎么样正向生成代码. 正向生成,指的是先创建model.py文件,然后通过django内置的编译器,在数据库如mysql中创建出符合model. ...

  2. Jmeter在Http Rest接口中自动生成签名(Json格式请求参数)

    第一步: 签名的java类生成jar包,导入到jmeter的lib目录下(依赖的第三方包也要导入) 第二步:编写jmeter脚本,这里使用BeanShell 进行签名串的生成,目录结构如下: Bean ...

  3. 如何修改Django中的日期和时间格式 DateTimeField

    html页面从数据库中读出DateTimeField字段时,显示的时间格式和数据库中存放的格式不一致,比如数据库字段内容为2017-06-03 13:00:00,但是页面显示的却是Apr. 03, 2 ...

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

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

  5. django中动态生成二级菜单

    一.动态显示二级菜单 1.修改权限表结构 (1)分析需求,要求左侧菜单如下显示: 客户管理: 客户列表 账单管理: 账单列表 (2)修改rbac下的models.py,修改后代码如下: from dj ...

  6. Django中指定生成表名的方法

    在模型类中定义元类: class Meta: de_table = 'tableName' #指定表名

  7. django中两张表有外键关系的相互查找方法,自定义json编码方法

    两张通过外键联系的表,如何在一张表上根据另一张表上的属性查找满足条件的对象集? 平常查找表中数据的条件是python中已有的数据类型,通过名字可以直接查找.如果条件是表中外键列所对应表的某一列,该如何 ...

  8. django中iframe问题

    因为在django中无法识别我们普通的url格式,比如使用<iframe src="articles.html"></iframe>,这种格式django无 ...

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

    一.Django中的缓存: 前戏: 在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑,最后生成用户看到的页面. 当一个网站的用户访问量很大的时候,每一 ...

随机推荐

  1. Java application 性能分析分享

    性能分析的主要方式 监视:监视是一种用来查看应用程序运行时行为的一般方法.通常会有多个视图(View)分别实时地显示 CPU 使用情况.内存使用情况.线程状态以及其他一些有用的信息,以便用户能很快地发 ...

  2. 如何获取版本的 Internet 信息服务器 (IIS)

    不同的操作系统对应不同IIS http://support.microsoft.com/kb/224609/zh-cn

  3. 命令行解释器(shell)

    unix> ./hello hello world unix> ll 显示当前目录下文件信息. shell为命令行解释器,第一个单词可以是内置的外壳命令,也可以是一个可执行文件名.

  4. C与C++动态分配二维数组

    C: C中使用函数malloc和free两个函数. //动态分配M*N维 int **a=(int **)malloc(sizeof(int*)*M); ;i<M;i++) a[i]=(int ...

  5. ffmpeg+SDl+ 播放器 -01

    最近因公司项目需要,打算自己在LINUX平台整一个播放器,来学习和研究音频编解码. 项目需求: 支持下列格式文件播放. 1> WMA 硬件解码,但需要软件分析ASF格式,提取Payload数据 ...

  6. 从头开始-03.C语言中数据类型

    基本数据类型 整形: Int 4字节 %d / %i Short 2字节 %hd Long 8字节 %ld Longlong 8字节 %lld Unsigned 4字节 % 浮点型 单精度 Float ...

  7. DoNet开源项目-基于jQuery EasyUI的后台管理系统

    博主在业余时间开发了一个简单的后台管理系统,其中用到了 jQuery EasyUI 框架,上次分享过系统布局,参考文章:jQuery EasyUI 后台管理系统布局分享,目前已完成系统的整体框架的搭建 ...

  8. QT-Creator C/C++ 打地鼠小游戏

    废话少说先上图: 这个游戏纯属土鳖思路,没有用到什么游戏引擎. 1.使用按钮或QLabel铺满窗口. 2.通过简单算法随机动态的设置按钮矩阵中某个按钮的背景图像. 3.同步2过程反复设置多个按钮背景实 ...

  9. Oracle GoldenGate配置异构数据库数据传输(oracle到sqlserer)的dml操作(带pump进程)

    实验环境:os01:Red Hat Enterprise Linux Server release 5.1 (32位)db01:oracle 10.2.0.1.0 os02:Windows 7 (32 ...

  10. javascript 正则表达式代码

    正则表达式用于字符串处理.表单验证等场合,实用高效.现将一些常用的表达式收集于此,以备不时之需. 匹配中文字符的正则表达式: [\u4e00-\u9fa5] 评注:匹配中文还真是个头疼的事,有了这个表 ...