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实现Youku视频批量下载功能
Mar 14 Python
Django查询数据库的性能优化示例代码
Sep 24 Python
分分钟入门python语言
Mar 20 Python
python SQLAlchemy 中的Engine详解
Jul 04 Python
python列表返回重复数据的下标
Feb 10 Python
Python面向对象中类(class)的简单理解与用法分析
Feb 21 Python
Python开发企业微信机器人每天定时发消息实例
Mar 17 Python
Jupyter 无法下载文件夹如何实现曲线救国
Apr 22 Python
Python如何爬取b站热门视频并导入Excel
Aug 10 Python
Python Charles抓包配置实现流程图解
Sep 29 Python
Python爬虫爬取ts碎片视频+验证码登录功能
Feb 22 Python
python 如何执行控制台命令与操作剪切板
May 20 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中的加密功能
2006/10/09 PHP
PHP 常用数组内部函数(Array Functions)介绍
2013/06/05 PHP
ThinkPHP表单自动提交验证实例教程
2014/07/18 PHP
ThinkPHP控制器里javascript代码不能执行的解决方法
2014/11/22 PHP
php使用number_format函数截取小数的方法分析
2016/05/27 PHP
php强制下载文件函数
2016/08/24 PHP
使用WAMP搭建PHP本地开发环境
2017/05/10 PHP
JS控制显示隐藏兼容问题(IE6、IE7、IE8)
2010/04/01 Javascript
jquery.validate使用攻略 第五步 正则验证
2010/07/01 Javascript
jQuery 1.7.2中getAll方法的疑惑分析
2012/05/23 Javascript
基于Unit PNG Fix.js有时候在ie6下不正常的解决办法
2013/06/26 Javascript
javascript实现简单的Map示例介绍
2013/12/23 Javascript
Iframe 自动适应页面的高度示例代码
2014/02/26 Javascript
jQuery对象与DOM对象之间的相互转换
2015/03/03 Javascript
JS中产生标识符方式的演变
2015/06/12 Javascript
基于JavaScript怎么实现让歌词滚动播放
2015/11/03 Javascript
laydate.js日期时间选择插件
2017/01/04 Javascript
JQuery中的常用事件、对象属性与使用方法分析
2019/12/23 jQuery
ES6中的Javascript解构的实现
2020/10/30 Javascript
Python加pyGame实现的简单拼图游戏实例
2015/05/15 Python
python使用WMI检测windows系统信息、硬盘信息、网卡信息的方法
2015/05/15 Python
Python request设置HTTPS代理代码解析
2018/02/12 Python
python+pyqt5实现KFC点餐收银系统
2019/01/24 Python
django项目环境搭建及在虚拟机本地创建django项目的教程
2019/08/02 Python
Selenium 配置启动项参数的方法
2020/12/04 Python
this关键字的作用
2016/01/30 面试题
职业生涯规划书的格式
2013/12/29 职场文书
农业资源与环境专业自荐信范文
2013/12/30 职场文书
服装电子商务创业计划书
2014/01/30 职场文书
个人贷款担保书
2014/04/01 职场文书
2014年初三班主任工作总结
2014/12/05 职场文书
汽车转让协议书范本
2014/12/07 职场文书
钱塘江大潮导游词
2015/02/03 职场文书
故意伤害罪辩护词
2015/05/21 职场文书
学校就业保障协议书
2019/06/24 职场文书
Win11怎么添加用户?Win11添加用户账户的方法
2022/07/15 数码科技