一个Django视图函数 必须

接受一个HttpRequest 实例作为它的第一个參数

返回一个HttpResponse 实例

从一个视图返回一个非HTML 内容的关键是在构造一个 HttpResponse类时,须要指定 mimetype參数。 通过改变 MIME 类型。我们能够通知浏览器将要返回的数据是还有一种类型。以下我们以返回一张PNG图片的视图为例。 为了使事情能尽可能的简单。我们仅仅是读入一张存储在磁盘上的图片:

首先放入一个图片到Bidding\images\testPIC.png中,然后编辑视图:

Bidding\views.py:

  1. def my_image(request):
  2. image_data = open("Bidding/images/testPIC.png", "rb").read()
  3. return HttpResponse(image_data, mimetype="image/png")

改动urls.py:

  1. from django.conf.urls import patterns, include, url
  2.  
  3. # Uncomment the next two lines to enable the admin:
  4. # from django.contrib import admin
  5. # admin.autodiscover()
  6.  
  7. urlpatterns = patterns('',
  8. # Examples:
  9. # url(r'^$', 'Bidding.views.home', name='home'),
  10. # url(r'^Bidding/', include('Bidding.foo.urls')),
  11.  
  12. # Uncomment the admin/doc line below to enable admin documentation:
  13. # url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
  14.  
  15. # Uncomment the next line to enable the admin:
  16. # url(r'^admin/', include(admin.site.urls)),
  17. url(r'^hello/$', 'Bidding.views.hello'),
  18. url(r'^time/$', 'Bidding.views.current_datetime'),
  19. url(r'^time/plus/(\d{1,2})/$', 'Bidding.views.hours_ahead'),
  20. url(r'^hello_base/$', 'Bidding.views.hello_base'),
  21. url(r'^request_test/$', 'Bidding.views.request_test'),
  22. url(r'^UsersSearch/$', 'Bidding.Users.views.search_form'),
  23. url(r'^search/$', 'Bidding.Users.views.search'),
  24. url(r'^ClassRoom/add/$', 'person.views.ClassroonAdd'),
  25. url(r'^ClassRoom/list/$', 'person.views.ClassroonList'),
  26. url(r'^ClassRoom/modify/(\d+)/$', 'person.views.ClassroonModify'),
  27. url(r'^ClassRoom/delete/(\d+)/$', 'person.views.ClassroonDelete'),
  28. url(r'^testPIC/$', 'Bidding.views.my_image'),
  29. )

打开http://127.0.0.1:8000/testPIC/就能看到这个图片了:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGVtZW5nMTk4MA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

就是这么简单。 假设改变open() 中的图片路径为一张真实图片的路径,那么就能够使用这个十分简单的视图来提供一张图片。而且浏览器能够正确显示它。

另外我们必须了解的是HttpResponse对象实现了Python标准的文件应用程序接口(API)。 这就是说你能够在Python(或第三方库)不论什么用到文件的地方使用”HttpResponse”实例。

以下我来看看怎样生成和输出一个PDF文件,这时要用到两个Python的插件 :

reportlab-2.6.win32-py2.7.exe

PIL-1.1.7.win32-py2.7.exe

双击安装在本地:

加入视图:

  1. def hello_pdf(request):
  2. # Create the HttpResponse object with the appropriate PDF headers.
  3. response = HttpResponse(mimetype='application/pdf')
  4. response['Content-Disposition'] = 'attachment; filename=hello.pdf'
  5.  
  6. # Create the PDF object, using the response object as its "file."
  7. p = canvas.Canvas(response)
  8.  
  9. # Draw things on the PDF. Here's where the PDF generation happens.
  10. # See the ReportLab documentation for the full list of functionality.
  11. p.drawString(100, 750, "Hello world.")
  12. # Close the PDF object cleanly, and we're done.
  13. p.showPage()
  14. p.save()
  15. return response

改动urls.py:

  1. from django.conf.urls import patterns, include, url
  2.  
  3. # Uncomment the next two lines to enable the admin:
  4. # from django.contrib import admin
  5. # admin.autodiscover()
  6.  
  7. urlpatterns = patterns('',
  8. # Examples:
  9. # url(r'^$', 'Bidding.views.home', name='home'),
  10. # url(r'^Bidding/', include('Bidding.foo.urls')),
  11.  
  12. # Uncomment the admin/doc line below to enable admin documentation:
  13. # url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
  14.  
  15. # Uncomment the next line to enable the admin:
  16. # url(r'^admin/', include(admin.site.urls)),
  17. url(r'^hello/$', 'Bidding.views.hello'),
  18. url(r'^time/$', 'Bidding.views.current_datetime'),
  19. url(r'^time/plus/(\d{1,2})/$', 'Bidding.views.hours_ahead'),
  20. url(r'^hello_base/$', 'Bidding.views.hello_base'),
  21. url(r'^request_test/$', 'Bidding.views.request_test'),
  22. url(r'^UsersSearch/$', 'Bidding.Users.views.search_form'),
  23. url(r'^search/$', 'Bidding.Users.views.search'),
  24. url(r'^ClassRoom/add/$', 'person.views.ClassroonAdd'),
  25. url(r'^ClassRoom/list/$', 'person.views.ClassroonList'),
  26. url(r'^ClassRoom/modify/(\d+)/$', 'person.views.ClassroonModify'),
  27. url(r'^ClassRoom/delete/(\d+)/$', 'person.views.ClassroonDelete'),
  28. url(r'^testPIC/$', 'Bidding.views.my_image'),
  29. url(r'^testPDF/$', 'Bidding.views.hello_pdf'),
  30. )

这时你在訪问testPDF这个页面的时候就能够看到输出的PDF了!

可是如今假设把代码上传,执行sae上的程序则会出现一下错误:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGVtZW5nMTk4MA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

这时由于sae端并没有安装这个第三方的插件。因此我们以下就来解说一下怎样在sae端安装第三方插件:

还记得我们在本地安装的

reportlab-2.6.win32-py2.7.exe

PIL-1.1.7.win32-py2.7.exe

吧 ,双击后事实上就是把里面的内容复制到了C:\Python27\Lib\site-packages里一个叫reportlab,一个叫PIL。我们把这两个包压缩一下,变成reportlab.zip和 PIL.zip,然后我们通过sae上传到网上:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGVtZW5nMTk4MA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

完毕后你会在代码编辑页面里面看到这种结果:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGVtZW5nMTk4MA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

这时改动你的index.wsgi:

  1. import sae
  2. from Bidding import wsgi
  3. import os
  4. import sys
  5.  
  6. app_root = os.path.dirname(__file__)
  7. sys.path.insert(0, os.path.join(app_root, 'reportlab'))
  8.  
  9. application = sae.create_wsgi_app(wsgi.application)

在通过svn上传server,这样sae就认识你使用的第三方包了!在执行sae端的程序。你就会看到和本地一样的情况了!

处理以外教程 中还列举了一些输出其他文件的样例,这里就不再一一介绍了,我们会在后面的章节介绍的:

ZIP文件 :Python
标准库中包括有 zipfile 模块。它能够读和写压缩的ZIP
文件。它能够用于按需生成一些文件的压缩包,或者在须要时压缩大的文档。

假设是TAR
文件则能够使用标准库 tarfile 模块。

动态图片 : Python
图片处理库 (PIL; http://www.pythonware.com/products/pil/)是极好的生成图片(PNG,
JPEG, GIF 以及其他很多格式)的工具。它能够用于自己主动为图片生成缩略图,将多张图片压缩到单独的框架中。或者是做基于 Web
的图片处理。

图表 : Python
有很多出色而且强大的图表库用以绘制图表。按需地图。表格等。我们不可能将它们所有列出,所以以下列出的是个中的翘楚。

§  matplotlib (http://matplotlib.sourceforge.net/)
能够用于生成一般是由matlab
或者Mathematica
生成的高质量图表。

§  pygraphviz (https://networkx.lanl.gov/wiki/pygraphviz)
是一个 Graphviz
图形布局的工具 (http://graphviz.org/)的Python
接口,能够用于生成结构化的图表和网络。

后面教程有介绍了输出RSS,事实上RSS是个非常好的东西,可是这里的问题是一般内容都是一个站点的核心,假设提供了RSS,用户或者其它站点均能够订阅、查看而不用看广告等信息,这不是站点的站长愿意看到的,所以,这个技术一直在国内没有一个非常好的应用。这里感兴趣的同学能够继续看http://djangobook.py3k.cn/2.0/chapter13/这里的教程。本教程中就不再介绍了。

Python+Django+SAE系列教程15-----输出非HTML内容(图片/PDF)的更多相关文章

  1. Python+Django+SAE系列教程17-----authauth (认证与授权)系统1

    通过session,我们能够在多次浏览器请求中保持数据,接下来的部分就是用session来处理用户登录了. 当然,不能仅凭用户的一面之词,我们就相信,所以我们须要认证. 当然了,Django 也提供了 ...

  2. Python+Django+SAE系列教程11-----request/pose/get/表单

    表单request,post,get 首先我们来看看Request对象,在这个对象中包括了一些实用的信息,学过B/S开发的人来说这并不陌生,我们来看看在Django中是怎样实现的: 属性/方法 说明 ...

  3. Python+Django+SAE系列教程9-----Django的视图和URL

    第三.四.五章介绍的就是Django中MVC的视图.模板.模型了. 首先来看视图(view),在用Django生成的站点目录中,创建一个view.py文件,这个文件開始是空的.然后我们输入下面内容: ...

  4. Python+Django+SAE系列教程12-----配置MySQL数据库

    由于SAE上支持的是Mysql,首先我们要在本地配置一个Mysql的环境 ,我在网上找到MySQL-python-1.2.4b4.win32-py2.7.exe,并双击 安装 选择典型安装 安装结束后 ...

  5. Python+Django+SAE系列教程10-----Django模板

    在本章中,我们开始模板,在前面的章节,您可能已经注意到,我们回到文本的方式有点特别的示例视图. 那.HTML直接在硬编码 Python 其中代码. 这的确是一个小BT. def current_dat ...

  6. Python+Django+SAE系列教程16-----cookie&session

    本章我们来解说cookie和session ,这两个东西相信大家一定不陌生,概念就不多讲了,我们直接来看其使用方法,首先是cookie,我们在view中加入三个视图,一个是显示cookie的,一个是设 ...

  7. Python+Django+SAE系列教程6-----本地配置Django

    前五章.我们介绍了Python的语法,本章開始介绍Django. Python的Web框架有非常多,有Django.web2py.tornado.web.py等.我们这里选 则Django.至于这些框 ...

  8. Python+Django+SAE系列教程13-----MySQL记录的添\删\改

    建立了数据库后,我们就来做一个简单的表(person_classroom)的加入.删除.改动的操作. 首先我们建立一个加入的页面的模板Classroom_Add.html(加入的表单)并把它放在Bid ...

  9. Python+Django+SAE系列教程14-----使表单更安全

    还记得我们上一章提到过的加入页面吗? watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGVtZW5nMTk4MA==/font/5a6L5L2T/fonts ...

随机推荐

  1. (十六)JQuery Ready和angularJS controller的运行顺序问题

    项目中使用了JQuery和AngularJS框架,近期定位一个问题,原因就是JQuery Ready写在了angularJS controller之前,导致JQuery选择器无法选中须要的元素(由于a ...

  2. activity入门

    1.前单文件 <activity android:name="com.example.twoactivity.OtherScreenActivity" android:lab ...

  3. 闲扯 Javascript 01 实现选项卡

    javascript 实现选项卡 今天下午的两节课,在机房闲来没事 ,就学习了javascript 怎么获取HTML的标签,改变CSS样式,资料来源 智能社! <script> windo ...

  4. 分享非常有用的Java程序 (关键代码) (三)---创建ZIP和JAR文件

    原文:分享非常有用的Java程序 (关键代码) (三)---创建ZIP和JAR文件 import java.util.zip.*; import java.io.*; public class Zip ...

  5. hdu1172猜数字

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1172 题目 猜数字 Time Limit: 20000/10000 MS (Java/Others) ...

  6. 基于MapReduce的HBase开发

    在伪分布式模式和全分布式模式下 HBase 是架构在 HDFS 上的,因此完全可以将MapReduce 编程框架和 HBase 结合起来使用.也就是说,将 HBase 作为底层“存储结构”, MapR ...

  7. [置顶] Hibernate从入门到精通(七)多对一单向关联映射

    上次的博文Hibernate从入门到精通(六)一对一双向关联映射中我们介绍了一下一对一双向关联映射,本次博文我们讲解一下多对一关联映射 多对一单向关联映射 多对一关联映射与一对一关联映射类似,只是在多 ...

  8. [译]TCP和UDP的区别

    译者:华科小涛:http://www.cnblogs.com/hust-ghtao/ 最近开始学习计算机网络的知识,找了些英文的资料,翻译过来,一是为了深入学习网络,也是为了锻炼自己看英文文档的能力. ...

  9. Perl 5 教程

    Perl 5 教程 http://www.cbi.pku.edu.cn/chinese/documents/perl/index.htm

  10. 基于visual Studio2013解决C语言竞赛题之1033数字交换

          题目 解决代码及点评 /* 功能:将一个一维数组中的偶数依次交换.例如有8个元素, 若其中第1.4.5三元素是偶数时应按下图交换. 例子: a[]={2,3,1,6 ...