Web远不止有HTML,在Web上可以用多种格式来发布数据:RSS、PDF、图片等。
Django拥有一些便利的内建工具帮助你生成常见的非HTML内容:
- RSS/Atom聚合文件
- 站点地图
基础:视图和MIME类型
更正式地说,一个Django视图函数必须
- 接收一个HttpRequest参数
- 返回一个HttpResponse实例
从一个视图返回一个非HTML内容的关键是在构造一个HttpResponse类,需要指定content_type参数。通过改变MIME类型,我们可以通知浏览器将要返回的数据是另一个类型。
显示一张图片
def my_image(request):
image_data=open('all_static/admin/img/img1.jpg',"rb").read()
return HttpResponse(image_data,content_type="image/jpg")
由于Djnago1.7以上的版本不再使用mimetype而使用content_type来指定类型。
生成CSV文件
CSV是一种简单的数据格式,通常为电子表格所用。它主要是由一系列的表格行组成,每行中单元格只见使用逗号隔开。
因为csv模块操作的是类似文件的对象,所以可以使用HrrpResponse替换:
打印一张违规乘客每年的人数的表
import csv
UNRULY_PASSENGERS=[146,184,235,200,226,251,299,273,281,304,203]
def unruly_passengers_csv(request):
#响应返回的是text/csv类型,这会告诉浏览器,返回的文档是CSV文件
response=HttpResponse(content_type='test/csv')
#响应会有一个附加的Content-Disposition头部,它包含有CSV文件的文件名。这个头部
#会指示浏览器弹出对话框询问文件存放的位置。它会显示在浏览器的另存未对话框中
#只需把HttpResponse当作字典使用就可以了
response['Content-Disposition']='attachment;filename=unruly.csv'
#与创建的应用程序界面挂接:csv.writer函数需要一个文件类的对象
writer=csv.writer(response)
# writer.writerow传递给它一个类似list或者tuple的可迭代对象,就可以在
#CSV文件中写入一行
writer.writerow(['Year','Unruly Airline Passengers'])
for (year,num) in zip(range(1995,2006),UNRULY_PASSENGERS):
writer.writerow([year,num])
return response
在任何需要返回非HTML内容的时候,都需要经过以下几步:
创建一个HttpResponse响应对象,把它传给需要处理文件的函数,然后返回这个响应对象。
生成PDF文件
便携文档格式PDF是由Adobe开发的格式,主要用于呈现可打印的文档,其中包含有pixel-perfect格式,嵌入字体以及2D矢量图像。
安装ReportLab库:
pip install reportlab
和生成csv文件类似,因为ReportLab API也可以使用类似文件对象。
from reportlab.pdfgen import canvas
def hello_pdf(request):
response=HttpResponse(content_type='application/pdf')
response['Content-Disposition']='attachment;filename=hello.pdf'
#创建一个PDF对象,使用这个响应作为它的文件
p=canvas.Canvas(response)
p.drawString(100,100,'Hello world.')
#否则将会得到一个损坏的PDF文件
p.showPage()
p.save()
return response
其他可能性
ZIP文件:zipfile模块,如果是TAR文件则可以使用标准库tarfile模块;
动态图片:PIL,PNG,JPEG,GIF以及其他工具。
图表:matplotlib;pygraphviz