首页 > 编程 > Python > 正文

详解Python的Django框架中的通用视图

2020-02-23 01:04:22
字体:
来源:转载
供稿:网友

通用视图
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'}),)

运行结果:

201554160206617.png (384×80)
可以看到,没有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()

运行结果:

201554160228301.png (411×132)

安全问题的题外话
上面的例子中,有一个潜在的安全问题,比较容易被忽略。那就是template="about/%s.html" % page这
句,这样构造路径容易被名为directory traversal的手段攻击,简单的说就是利用"../"这样的返回父目录的
路径操作,去访问原本不应该被访问到的服务器上的文件,又被称为dot dot slash攻击。比如
使用"http://www.cnblogs.com/../etc/passwd"路径的话,有可能就能读取到服务器上的passwd这个文件,从而获取到
关键密码。
 
发布这篇博文的时候,cnblogs会把连续的"../"转义成"http://www.cnblogs.com",难道是在防止

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表