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

 更新时间:2015年07月20日 10:38:55   投稿:goldensun  
这篇文章主要介绍了在Python的Django框架中包装视图函数的方法,即requires_login的相关方法,需要的朋友可以参考下

我们最终的视图技巧利用了一个高级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 视图。

相关文章

  • Django使用Celery加redis执行异步任务的实例内容

    Django使用Celery加redis执行异步任务的实例内容

    在本篇文章里小编给大家整理的是关于Django使用Celery加redis执行异步任务,需要的朋友们可以学习下。
    2020-02-02
  • pandas中df.groupby()方法深入讲解

    pandas中df.groupby()方法深入讲解

    在使用pandas进行数据统计分析时遇到了问题,找了很久才找到解决办法,所以下面这篇文章主要给大家介绍了关于pandas中df.groupby()方法的相关资料,需要的朋友可以参考下
    2022-12-12
  • 使用python实现学生信息管理系统

    使用python实现学生信息管理系统

    这篇文章主要为大家详细介绍了使用python实现学生信息管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-02-02
  • Python中Pyspider爬虫框架的基本使用详解

    Python中Pyspider爬虫框架的基本使用详解

    这篇文章主要介绍了Python中Pyspider爬虫框架的基本使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • Python文本终端GUI框架的使用方法

    Python文本终端GUI框架的使用方法

    Python中有几个流行的文本终端GUI框架,它们提供了创建命令行界面的便捷方法,这些框架使开发者能够构建交互式、用户友好的命令行应用程序,本文将介绍几个主要的Python文本终端GUI框架,展示它们的使用方法和示例代码,需要的朋友可以参考下
    2023-12-12
  • Pandas借助Numpy实现优化的条件检索代码

    Pandas借助Numpy实现优化的条件检索代码

    Numpy其实是最早的处理数据的Python库,它的核心ndarray对象,是一个高效的n维数组结构,本文主要介绍了Pandas如何借助Numpy优化条件检索,感兴趣的可以了解下
    2024-03-03
  • python在不同条件下的输入与输出

    python在不同条件下的输入与输出

    在本篇文章里小编给大家整理的是关于python在不同条件下的输入与输出,有需要的朋友们可以学习下。
    2020-02-02
  • 对Django项目中的ORM映射与模糊查询的使用详解

    对Django项目中的ORM映射与模糊查询的使用详解

    今天小编就为大家分享一篇对Django项目中的ORM映射与模糊查询的使用详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07
  • 详解Python中的断点类型

    详解Python中的断点类型

    在 Python 中,断点是一种在代码中设置的标记,用于在程序执行过程中停止或中断程序的执行,本文将详细介绍 Python 中的断点类型,感兴趣的可以了解下
    2024-02-02
  • 基于Python编写词云软件并显示分词结果

    基于Python编写词云软件并显示分词结果

    这篇文章主要为大家详细介绍了如何基于Python编写一个简单的词云制作软件并显示分词结果,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的小伙伴可以了解一下
    2023-10-10

最新评论