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 相关文章推荐
通过数据库对Django进行删除字段和删除模型的操作
Jul 21 Python
Python实现完整的事务操作示例
Jun 20 Python
django中ORM模型常用的字段的使用方法
Mar 05 Python
django框架模板中定义变量(set variable in django template)的方法分析
Jun 24 Python
python之pexpect实现自动交互的例子
Jul 25 Python
python ftplib模块使用代码实例
Dec 31 Python
使用Django和Postgres进行全文搜索的实例代码
Feb 13 Python
python实现AHP算法的方法实例(层次分析法)
Sep 09 Python
Python 解析xml文件的示例
Sep 29 Python
python绘制雷达图实例讲解
Jan 03 Python
python 下载文件的几种方法汇总
Jan 06 Python
python 中[0]*2与0*2的区别说明
May 10 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
TMDPHP 模板引擎使用教程
2012/03/13 PHP
php笔记之:初探PHPcms模块开发介绍
2013/04/26 PHP
php保存信息到当前Session的方法
2015/03/16 PHP
php上传图片获取路径及给表单字段赋值的方法
2016/01/23 PHP
给moz-firefox下添加IE方法和属性
2007/04/10 Javascript
Js 时间间隔计算的函数(间隔天数)
2011/11/15 Javascript
Jquery submit()无法提交问题
2013/04/21 Javascript
css结合js制作下拉菜单示例代码
2014/02/27 Javascript
node.js中的fs.readdir方法使用说明
2014/12/17 Javascript
浅谈Javascript如何实现匀速运动
2014/12/19 Javascript
jQuery实现在下拉列表选择时获取json数据的方法
2015/04/16 Javascript
js判断浏览器类型及设备(移动页面开发)
2015/07/30 Javascript
JS组件Bootstrap Select2使用方法详解
2020/04/17 Javascript
个人网站留言页面(前端jQuery编写、后台php读写MySQL)
2016/05/03 Javascript
jquery实现无刷新验证码的简单实例
2016/05/19 Javascript
关闭Vue计算属性自带的缓存功能方法
2018/03/02 Javascript
浅谈Webpack 持久化缓存实践
2018/03/22 Javascript
微信小程序实现获取用户信息并存入数据库操作示例
2019/05/07 Javascript
微信小程序 搜索框组件代码实例
2019/09/06 Javascript
js 递归json树实现根据子id查父id的方法分析
2019/11/08 Javascript
微信小程序实现搜索框功能及踩过的坑
2020/06/19 Javascript
深入理解 ES6中的 Reflect用法
2020/07/18 Javascript
JavaScript检测是否开启了控制台(F12调试工具)
2020/10/02 Javascript
python获取android设备的GPS信息脚本分享
2015/03/06 Python
解决Keras使用GPU资源耗尽的问题
2020/06/22 Python
台湾SHOPRO购物行家:亚洲首创影视.3C.家电.优质购物平台
2018/05/07 全球购物
人力资源主管职责范本
2014/03/05 职场文书
新年联欢会主持词
2014/03/27 职场文书
生产文员岗位职责
2014/04/05 职场文书
商业企业管理专业求职信
2014/07/10 职场文书
2014教师评职称工作总结
2014/11/10 职场文书
2014年办公室主任工作总结
2014/11/12 职场文书
2016年五一劳动节专题校园广播稿
2015/12/17 职场文书
MySQL创建定时任务
2022/01/22 MySQL
Pycharm远程调试和MySQL数据库授权问题
2022/03/18 MySQL
VW、VH适配移动端的解决方案与常见问题
2023/05/21 HTML / CSS