在Python的Django框架中包装视图函数


Posted in Python onJuly 20, 2015

我们最终的视图技巧利用了一个高级python技术。 假设你发现自己在各个不同视图里重复了大量代码,就像 这个例子:

def my_view1(request):
  if not request.user.is_authenticated():
    return HttpResponseRedirect('/accounts/login/')
  # ...
  return render_to_response('template1.html')

def my_view2(request):
  if not request.user.is_authenticated():
    return HttpResponseRedirect('/accounts/login/')
  # ...
  return render_to_response('template2.html')

def my_view3(request):
  if not request.user.is_authenticated():
    return HttpResponseRedirect('/accounts/login/')
  # ...
  return render_to_response('template3.html')

这里,每一个视图开始都检查request.user是否是已经认证的,是的话,当前用户已经成功登陆站点否则就重定向/accounts/login/ (注意,虽然我们还没有讲到request.user,但是14章将要讲到它.就如你所想像的,request.user描述当前用户是登陆的还是匿名)

如果我们能够丛每个视图里移除那些 重复代,并且只在需要认证的时候指明它们,那就完美了。 我们能够通过使用一个视图包装达到目的。 花点时间来看看这个:

def requires_login(view):
  def new_view(request, *args, **kwargs):
    if not request.user.is_authenticated():
      return HttpResponseRedirect('/accounts/login/')
    return view(request, *args, **kwargs)
  return new_view

函数requires_login,传入一个视图函数view,然后返回一个新的视图函数new_view.这个新的视图函数new_view在函数requires_login内定义 处理request.user.is_authenticated()这个验证,从而决定是否执行原来的view函数

现在,我们可以从views中去掉if not request.user.is_authenticated()验证.我们可以在URLconf中很容易的用requires_login来包装实现.

from django.conf.urls.defaults import *
from mysite.views import requires_login, my_view1, my_view2, my_view3

urlpatterns = patterns('',
  (r'^view1/$', requires_login(my_view1)),
  (r'^view2/$', requires_login(my_view2)),
  (r'^view3/$', requires_login(my_view3)),
)

优化后的代码和前面的功能一样,但是减少了代码冗余 现在我们建立了一个漂亮,通用的函数requires_login()来帮助我们修饰所有需要它来验证的视图
包含其他URLconf

如果你试图让你的代码用在多个基于Django的站点上,你应该考虑将你的URLconf以包含的方式来处理。

在任何时候,你的URLconf都可以包含其他URLconf模块。 对于根目录是基于一系列URL的站点来说,这是必要的。 例如下面的,URLconf包含了其他URLConf:

from django.conf.urls.defaults import *

urlpatterns = patterns('',
  (r'^weblog/', include('mysite.blog.urls')),
  (r'^photos/', include('mysite.photos.urls')),
  (r'^about/$', 'mysite.views.about'),
)

admin模块有他自己的URLconf,你仅仅只需要在你自己的代码中加入include就可以了.

这里有个很重要的地方: 例子中的指向 include() 的正则表达式并 不 包含一个 $ (字符串结尾匹配符),但是包含了一个斜杆。 每当Django遇到 include() 时,它将截断匹配的URL,并把剩余的字符串发往包含的URLconf作进一步处理。

继续看这个例子,这里就是被包含的URLconf mysite.blog.urls :

from django.conf.urls.defaults import *

urlpatterns = patterns('',
  (r'^(\d\d\d\d)/$', 'mysite.blog.views.year_detail'),
  (r'^(\d\d\d\d)/(\d\d)/$', 'mysite.blog.views.month_detail'),
)

通过这两个URLconf,下面是一些处理请求的例子:

  •     /weblog/2007/ :在第一个URLconf中,模式 r'^weblog/' 被匹配。 因为它是一个 include() ,Django将截掉所有匹配的文本,在这里是 'weblog/' 。URL剩余的部分是 2007/ , 将在 mysite.blog.urls 这个URLconf的第一行中被匹配到。 URL仍存在的部分为 2007/ ,与第一行的 mysite.blog.urlsURL设置相匹配。
  •     /weblog//2007/(包含两个斜杠) 在第一个URLconf中,r'^weblog/'匹配 因为它有一个include(),django去掉了匹配的部,在这个例子中匹配的部分是'weblog/' 剩下的部分是/2007/ (最前面有一个斜杠),不匹配mysite.blog.urls中的任何一行.
  •     /about/ : 这个匹配第一个URLconf中的 mysite.views.about 视图。
Python 相关文章推荐
Python实现多线程下载文件的代码实例
Jun 01 Python
实例解析Python设计模式编程之桥接模式的运用
Mar 02 Python
Python切换pip安装源的方法详解
Nov 18 Python
Python字符串处理实例详解
May 18 Python
go和python变量赋值遇到的一个问题
Aug 31 Python
Ubuntu下使用python读取doc和docx文档的内容方法
May 08 Python
Scrapy框架爬取Boss直聘网Python职位信息的源码
Feb 22 Python
pip install 使用国内镜像的方法示例
Apr 03 Python
浅析python 定时拆分备份 nginx 日志的方法
Apr 27 Python
python和c语言哪个更适合初学者
Jun 22 Python
Python通过字典映射函数实现switch
Nov 06 Python
python爬虫中抓取指数的实例讲解
Dec 01 Python
Django中URL视图函数的一些高级概念介绍
Jul 20 #Python
Python的Django框架中从url中捕捉文本的方法
Jul 20 #Python
Django框架中处理URLconf中特定的URL的方法
Jul 20 #Python
在Django中创建URLconf相关的通用视图的方法
Jul 20 #Python
python通过socket查询whois的方法
Jul 18 #Python
Python字符串匹配算法KMP实例
Jul 18 #Python
Python通过正则表达式选取callback的方法
Jul 18 #Python
You might like
用PHP实现验证码功能
2006/10/09 PHP
PHP 长文章分页函数 带使用方法,不会分割段落,翻页在底部
2009/10/22 PHP
对PHP新手的一些建议(PHP学习经验总结)
2014/08/20 PHP
PHP 二级子目录(后台目录)设置二级域名
2017/03/02 PHP
PHP实现腾讯与百度坐标转换
2017/08/05 PHP
深入分析PHP设计模式
2020/06/15 PHP
js实现双击图片放大单击缩小的方法
2015/02/17 Javascript
jQuery实现图片与文字描述左右滑动自动切换的方法
2015/07/27 Javascript
基于jQuery实现返回顶部实例代码
2016/01/01 Javascript
正则表达式,替换所有HTML标签的简单实例
2016/11/28 Javascript
微信浏览器禁止页面下拉查看网址实例详解
2017/06/28 Javascript
使用vue实现grid-layout功能实例代码
2018/01/05 Javascript
微信小程序使用template标签实现五星评分功能
2018/11/03 Javascript
在webstorm开发微信小程序之使用阿里自定义字体图标的方法
2018/11/15 Javascript
微信上传视频文件提示(推荐)
2018/11/22 Javascript
js取0-9随机取4个数不重复的数字代码实例
2019/03/27 Javascript
Vue运用transition实现过渡动画
2019/05/06 Javascript
JS数组方法shift()、unshift()用法实例分析
2020/01/18 Javascript
微信小程序全选多选效果实现代码解析
2020/01/21 Javascript
你所不知道的Python奇技淫巧13招【实用】
2016/12/14 Python
python pandas 对series和dataframe的重置索引reindex方法
2018/06/07 Python
使用Numpy读取CSV文件,并进行行列删除的操作方法
2018/07/04 Python
浅谈tensorflow中几个随机函数的用法
2018/07/27 Python
selenium3+python3环境搭建教程图解
2018/12/07 Python
为娇小女性量身打造:Petite Studio
2018/11/01 全球购物
英国著名的美容护肤和护发产品购物网站:Lookfantastic
2020/11/23 全球购物
大学生精神文明先进个人事迹材料
2014/05/02 职场文书
自动化专业毕业生求职信
2014/06/18 职场文书
城市轨道交通工程职业生涯规划书范文
2014/09/16 职场文书
乡党政领导班子群众路线教育实践活动个人对照检查材料
2014/09/20 职场文书
交通事故赔偿协议书
2014/10/16 职场文书
公司授权委托书
2014/10/17 职场文书
2014年工程工作总结
2014/11/25 职场文书
对公司的意见和建议
2015/06/04 职场文书
快速学习Oracle触发器和游标
2021/06/30 Oracle
Python捕获、播放和保存摄像头视频并提高视频清晰度和对比度
2022/04/14 Python