在Python的Django框架中使用通用视图的方法

作者:goldensun 时间:2023-07-19 05:50:45 

使用通用视图的方法是在URLconf文件中创建配置字典,然后把这些字典作为URLconf元组的第三个成员。

例如,下面是一个呈现静态“关于”页面的URLconf:


from django.conf.urls.defaults import *
from django.views.generic.simple import direct_to_template

urlpatterns = patterns('',
 (r'^about/$', direct_to_template, {
   'template': 'about.html'
 })
)

一眼看上去似乎有点不可思议,不需要编写代码的视图! 它和第八章中的例子完全一样:direct_to_template视图仅仅是直接从传递过来的额外参数获取信息并用于渲染视图。

因为通用视图都是标准的视图函数,我们可以在我们自己的视图中重用它。 例如,我们扩展 about例子,把映射的URL从 /about//修改到一个静态渲染 about/.html 。 我们首先修改URL配置以指向新的视图函数:


from django.conf.urls.defaults import *
from django.views.generic.simple import direct_to_template
**from mysite.books.views import about_pages**

urlpatterns = patterns('',
 (r'^about/$', direct_to_template, {
   'template': 'about.html'
 }),
 **(r'^about/(\w+)/$', about_pages),**
)

接下来,我们编写 about_pages 视图的代码:


from django.http import Http404
from django.template import TemplateDoesNotExist
from django.views.generic.simple import direct_to_template

def about_pages(request, page):
 try:
   return direct_to_template(request, template="about/%s.html" % page)
 except TemplateDoesNotExist:
   raise Http404()

在这里我们象使用其他函数一样使用 direct_to_template 。 因为它返回一个HttpResponse对象,我们只需要简单的返回它就好了。 这里唯一有点棘手的事情是要处理找不到模板的情况。 我们不希望一个不存在的模板导致一个服务端错误,所以我们捕获TemplateDoesNotExist异常并且返回404错误来作为替代。

这里有没有安全性问题?

眼尖的读者可能已经注意到一个可能的安全漏洞: 我们直接使用从客户端浏览器得到的数据构造模板名称(template="about/%s.html" % page )。乍看起来,这像是一个经典的 目录跨越(directory traversal) 攻击(详情请看第20章)。 事实真是这样吗?

完全不是。 是的,一个恶意的 page 值可以导致目录跨越,但是尽管 page 是 从请求的URL中获取的,但并不是所有的值都会被接受。 这就是URL配置的关键所在: 我们使用正则表达式 \w+ 来从URL里匹配 page ,而 \w 只接受字符和数字。 因此,任何恶意的字符 (例如在这里是点 . 和正斜线 / )将在URL解析时被拒绝,根本不会传递给视图函数。

标签:Django,视图
0
投稿

猜你喜欢

  • JavaScript实现二叉树的先序、中序及后序遍历方法详解

    2024-04-29 14:07:28
  • Python动态强类型解释型语言原理解析

    2021-12-24 08:09:27
  • python 运用Django 开发后台接口的实例

    2021-02-02 00:48:02
  • pandas loc iloc ix用法详细分析

    2021-08-31 20:16:53
  • Python 结巴分词实现关键词抽取分析

    2023-08-13 08:20:06
  • Python与C/C++的相互调用案例

    2021-12-23 02:21:29
  • python实现股票历史数据可视化分析案例

    2021-12-20 00:29:10
  • IBatis.net连接MySql 问题与故障的解决方案

    2011-06-02 09:38:00
  • pymysql实现增删改查的操作指南(python)

    2024-01-20 08:04:04
  • 用python将word文档合并实例代码

    2021-08-13 06:17:01
  • MySQL过滤重复数据的两种方法示例

    2024-01-16 12:54:27
  • Oracle中执行动态SQL

    2024-01-19 20:55:37
  • 用ASP在线创建Word与Excel文档

    2008-07-20 19:17:00
  • python的pygal模块绘制反正切函数图像方法

    2021-08-01 18:48:21
  • 使用python解析json字段的3种方式实例

    2021-12-24 04:16:27
  • JS获得选取checkbox整行数据的方法

    2024-02-26 21:10:33
  • PHP中文件读、写、删的操作(PHP中对文件和目录操作)

    2023-11-22 06:03:23
  • W3C优质网页小贴士(三)

    2008-04-09 13:32:00
  • Spring Cloud Feign高级应用实例详解

    2021-04-23 07:12:36
  • 解决Mac安装scrapy失败的问题

    2022-12-26 10:28:32
  • asp之家 网络编程 m.aspxhome.com