Django中对通过测试的用户进行限制访问的方法


Posted in Python onJuly 23, 2015

限制访问可以基于某种权限,某些检查或者为login视图提供不同的位置,这些实现方式大致相同。

一般的方法是直接在视图的 request.user 上运行检查。 例如,下面视图确认用户登录并是否有 polls.can_vote权限:

def vote(request):
 if request.user.is_authenticated() and request.user.has_perm('polls.can_vote')):
  # vote here
 else:
  return HttpResponse("You can't vote in this poll.")

并且Django有一个称为 user_passes_test 的简洁方式。它接受参数然后为你指定的情况生成装饰器。

def user_can_vote(user):
 return user.is_authenticated() and user.has_perm("polls.can_vote")

@user_passes_test(user_can_vote, login_url="/login/")
def vote(request):
 # Code here can assume a logged-in user with the correct permission.
 ...

user_passes_test 使用一个必需的参数: 一个可调用的方法,当存在 User 对象并当此用户允许查看该页面时返回 True 。 注意 user_passes_test 不会自动检查 User

    是否认证,你应该自己做这件事。

例子中我们也展示了第二个可选的参数 login_url ,它让你指定你的登录页面的URL(默认为 /accounts/login/ )。 如果用户没有通过测试,那么user_passes_test将把用户重定向到login_url

既然检查用户是否有一个特殊权限是相对常见的任务,Django为这种情形提供了一个捷径: permission_required() 装饰器。 使用这个装饰器,前面的例子可以改写为:

from django.contrib.auth.decorators import permission_required

@permission_required('polls.can_vote', login_url="/login/")
def vote(request):
 # ...

注意, permission_required() 也有一个可选的 login_url 参数, 这个参数默认为 '/accounts/login/' 。

限制通用视图的访问

在Django用户邮件列表中问到最多的问题是关于对通用视图的限制性访问。 为实现这个功能,你需要自己包装视图,并且在URLconf中,将你自己的版本替换通用视图:

from django.contrib.auth.decorators import login_required
from django.views.generic.date_based import object_detail

@login_required
def limited_object_detail(*args, **kwargs):
 return object_detail(*args, **kwargs)

当然, 你可以用任何其他限定修饰符来替换 login_required 。

Python 相关文章推荐
深入Python解释器理解Python中的字节码
Apr 01 Python
浅谈Python的list中的选取范围
Nov 12 Python
Python2与Python3的区别实例分析
Apr 11 Python
Python2与Python3的区别实例总结
Apr 17 Python
简单了解python中的与或非运算
Sep 18 Python
python 并发下载器实现方法示例
Nov 22 Python
python中的数组赋值与拷贝的区别详解
Nov 26 Python
Python闭包装饰器使用方法汇总
Jun 29 Python
Django用户认证系统如何实现自定义
Nov 12 Python
linux centos 7.x 安装 python3.x 替换 python2.x的过程解析
Dec 14 Python
Python - 10行代码集2000张美女图
May 23 Python
浅析Python OpenCV三种滤镜效果
Apr 11 Python
在Django中限制已登录用户的访问的方法
Jul 23 #Python
详解Django框架中用户的登录和退出的实现
Jul 23 #Python
在Django的session中使用User对象的方法
Jul 23 #Python
Django的session中对于用户验证的支持
Jul 23 #Python
在Django的视图(View)外使用Session的方法
Jul 23 #Python
在Python的Django框架的视图中使用Session的方法
Jul 23 #Python
详解Python的Django框架中的Cookie相关处理
Jul 22 #Python
You might like
学习php设计模式 php实现原型模式(prototype)
2015/12/07 PHP
CL vs ForZe BO5 第二场 2.13
2021/03/10 DOTA
模仿JQuery.extend函数扩展自己对象的js代码
2009/12/09 Javascript
JQuery中使文本框获得焦点的方法实例分析
2015/02/28 Javascript
超漂亮的jQuery图片轮播特效
2015/11/24 Javascript
莱鸟介绍javascript onclick事件
2016/01/06 Javascript
如何消除inline-block属性带来的标签间间隙
2016/03/31 Javascript
JS及PHP代码编写八大排序算法
2016/07/12 Javascript
原生js实现网易轮播图效果
2020/04/10 Javascript
AngularJS过滤器filter用法总结
2016/12/13 Javascript
JS回调函数深入理解
2019/10/16 Javascript
vue data恢复初始化数据的实现方法
2019/10/31 Javascript
python函数返回多个值的示例方法
2013/12/04 Python
零基础写python爬虫之HTTP异常处理
2014/11/05 Python
Python自动化部署工具Fabric的简单上手指南
2016/04/19 Python
python基础教程之分支、循环简单用法
2016/06/16 Python
Python实现Event回调机制的方法
2019/02/13 Python
Python学习笔记之读取文件、OS模块、异常处理、with as语法示例
2019/06/04 Python
flask框架路由常用定义方式总结
2019/07/23 Python
Python爬虫使用代理IP的实现
2019/10/27 Python
python3实现从kafka获取数据,并解析为json格式,写入到mysql中
2019/12/23 Python
Python列表去重复项的N种方法(实例代码)
2020/05/12 Python
python 模拟登陆github的示例
2020/12/04 Python
CSS3改变浏览器滚动条样式
2019/01/04 HTML / CSS
意大利网上药房:Farmacia 33
2020/01/27 全球购物
私有程序集与共享程序集有什么区别
2013/04/05 面试题
在C#中如何实现多态
2014/07/02 面试题
国贸专业个人求职信范文
2014/01/08 职场文书
电视购物广告词
2014/03/19 职场文书
优秀安全员事迹材料
2014/05/11 职场文书
搞笑婚前保证书
2015/02/28 职场文书
在校证明模板
2015/06/17 职场文书
行为规范主题班会
2015/08/13 职场文书
反邪教学习心得体会
2016/01/15 职场文书
什么是求职信?求职信应包含哪些内容?
2019/08/14 职场文书
仅用几行Python代码就能复制她的U盘文件?
2021/06/26 Python