在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 相关文章推荐
用pickle存储Python的原生对象方法
Apr 28 Python
利用Python暴力破解zip文件口令的方法详解
Dec 21 Python
Python基于pyCUDA实现GPU加速并行计算功能入门教程
Jun 19 Python
python3.x 将byte转成字符串的方法
Jul 17 Python
scrapy-redis的安装部署步骤讲解
Feb 27 Python
python异步存储数据详解
Mar 19 Python
pyqt5实现登录界面的模板
May 30 Python
python虚拟环境模块venv使用及示例
Mar 04 Python
Django 404、500页面全局配置知识点详解
Mar 10 Python
python3 使用openpyxl将mysql数据写入xlsx的操作
May 15 Python
Pycharm配置autopep8实现流程解析
Nov 28 Python
如何使用Tkinter进行窗口的管理与设置
Jun 30 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/12/21 PHP
台湾中原大学php教程孙仲岳主讲
2008/01/07 PHP
php注销代码(session注销)
2012/05/31 PHP
PHP中对缓冲区的控制实现代码
2013/09/29 PHP
PHP实现根据图片色界在不同位置加水印的方法
2015/08/08 PHP
php 生成Tab键或逗号分隔的CSV
2016/09/24 PHP
分享一个漂亮的php验证码类
2016/09/29 PHP
javascript 设置文本框中焦点的位置
2009/11/20 Javascript
js实现的日期操作类DateTime函数代码
2010/03/16 Javascript
jQuery LigerUI 插件介绍及使用之ligerDrag和ligerResizable示例代码打包
2011/04/06 Javascript
浅谈JavaScript函数参数的可修改性问题
2013/12/05 Javascript
JQuery1.8 判断元素是否绑定事件的方法
2014/07/10 Javascript
js实现的全国省市二级联动下拉选择菜单完整实例
2015/08/17 Javascript
基于javascript实现根据身份证号码识别性别和年龄
2016/01/22 Javascript
AngularJS基础 ng-list 指令详解及示例代码
2016/08/02 Javascript
微信小程序 实例应用(记账)详解
2016/09/28 Javascript
Bootstrap实现带暂停功能的轮播组件(推荐)
2016/11/25 Javascript
浅谈jQuery this和$(this)的区别及获取$(this)子元素对象的方法
2016/11/29 Javascript
javascript 注释代码的几种方法总结
2017/01/04 Javascript
3分钟掌握常用的JS操作JSON方法总结
2017/04/25 Javascript
js获取一组日期中最近连续的天数
2017/05/25 Javascript
javascript+html5+css3自定义弹出窗口效果
2017/10/26 Javascript
vue+axios新手实践实现登陆的示例代码
2018/06/06 Javascript
详解React之key的使用和实践
2018/09/29 Javascript
vue实现随机验证码功能的实例代码
2019/04/30 Javascript
JavaScript实现捕获鼠标坐标
2020/04/12 Javascript
[06:10]6.81新信使新套装!给你一个炫酷的DOTA2
2014/05/06 DOTA
Python3实现发送QQ邮件功能(文本)
2017/12/15 Python
解决pycharm下os.system执行命令返回有中文乱码的问题
2019/07/07 Python
python 的 openpyxl模块 读取 Excel文件的方法
2019/09/09 Python
python将时分秒转换成秒的实例
2019/12/07 Python
Python3爬虫里关于识别微博宫格验证码的知识点详解
2020/07/30 Python
Python调用系统命令os.system()和os.popen()的实现
2020/12/31 Python
css3绘制天猫logo实现代码
2012/11/06 HTML / CSS
HTML5头部标签的一些常用信息小结
2016/10/23 HTML / CSS
大学生求职自荐信
2015/03/24 职场文书