通用视图
1. 前言
回想一下,在Django中view层起到的作用是相当于controller的角色,在view中实施的
动作,一般是取得请求参数,再从model中得到数据,再通过数据创建模板,返回相应
响应对象。但在一些比较通用的功能中,比如显示对象列表,显示某对象信息,如果反复
写这么多流程的代码,也是一件浪费时间的事,在这里,Django同样给我们提供了类似的
"shortcut"捷径--通用视图。
2. 使用通用视图
使用通用视图的方法就是在urls.py这个路径配置文件中进行,创建字典配置信息,然后
传入patterns里的元组的第三个参数(extra-parameter),下面来看一个简单的例子:
from django.conf.urls.defaults import *from django.views.generic.simple import direct_to_templateurlpatterns = patterns('', url(r'^about/$', direct_to_template, {'template': 'about.html'}),)
运行结果:
可以看到,没有view的代码,也可以直接运行。在这里direct_to_template,这个方法
,传入第三个参数,然后直接进行渲染。
同时因为direct_to_template是一个函数,我们又可以把它放在view中,下面把
上面的例子改成匹配about/*,任意子网页。
#urls.pyfrom django.conf.urls.defaults import *from django.views.generic.simple import direct_to_templatefrom mysite.books.views import about_pagesurlpatterns = patterns('', (r'^about/$', direct_to_template, { 'template': 'about.html' }), (r'^about/(/w+)/$', about_pages),)# view.pyfrom django.http import Http404from django.template import TemplateDoesNotExistfrom django.views.generic.simple import direct_to_template#由正则匹配的参数def about_pages(request, page): try: return direct_to_template(request, template="about/%s.html" % page)#返回的HttpResponse except TemplateDoesNotExist: raise Http404()
运行结果:
安全问题的题外话
上面的例子中,有一个潜在的安全问题,比较容易被忽略。那就是template="about/%s.html" % page这
句,这样构造路径容易被名为directory traversal的手段攻击,简单的说就是利用"../"这样的返回父目录的
路径操作,去访问原本不应该被访问到的服务器上的文件,又被称为dot dot slash攻击。比如
使用"http://www.cnblogs.com/../etc/passwd"路径的话,有可能就能读取到服务器上的passwd这个文件,从而获取到
关键密码。
发布这篇博文的时候,cnblogs会把连续的"../"转义成"http://www.cnblogs.com",难道是在防止
新闻热点
疑难解答