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中unittest模块做UT(单元测试)使用实例
Jun 12 Python
分析并输出Python代码依赖的库的实现代码
Aug 09 Python
python 系统调用的实例详解
Jul 11 Python
Python实现读取邮箱中的邮件功能示例【含文本及附件】
Aug 05 Python
Django如何实现内容缓存示例详解
Sep 24 Python
Python实现简单的HttpServer服务器示例
Sep 25 Python
python的Crypto模块实现AES加密实例代码
Jan 22 Python
python获取程序执行文件路径的方法(推荐)
Apr 26 Python
python list是否包含另一个list所有元素的实例
May 04 Python
春节到了 教你使用python来抢票回家
Jan 06 Python
python argparse传入布尔参数false不生效的解决
Apr 20 Python
python 读取、写入txt文件的示例
Sep 27 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
基于mysql的论坛(1)
2006/10/09 PHP
PHP+Mysql基于事务处理实现转账功能的方法
2015/07/08 PHP
PHP实现的分解质因数操作示例
2018/08/01 PHP
javascript学习之闭包分析
2010/12/02 Javascript
JavaScript 函数的执行过程
2016/05/09 Javascript
完美JQuery图片切换效果的简单实现
2016/07/21 Javascript
基于iscroll.js实现下拉刷新和上拉加载效果
2016/11/28 Javascript
jQuery+vue.js实现的九宫格拼图游戏完整实例【附源码下载】
2017/09/12 jQuery
bootstrap select下拉搜索插件使用方法详解
2017/11/23 Javascript
详解ECMAScript typeof用法
2018/07/25 Javascript
基于vue-router 多级路由redirect 重定向的问题
2018/09/03 Javascript
JS调用安卓手机摄像头扫描二维码
2018/10/16 Javascript
在vue中使用echarts图表实例代码详解
2018/10/22 Javascript
防止Layui form表单重复提交的实现方法
2019/09/10 Javascript
element-ui 文件上传修改文件名的方法示例
2019/11/05 Javascript
JS实现商城秒杀倒计时功能(动态设置秒杀时间)
2019/12/12 Javascript
原生javascript制作贪吃蛇小游戏的方法分析
2020/02/26 Javascript
[57:55]EG vs Fnatic 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
Python深入学习之特殊方法与多范式
2014/08/31 Python
你所不知道的Python奇技淫巧13招【实用】
2016/12/14 Python
Python中元组,列表,字典的区别
2017/05/21 Python
浅谈Tensorflow 动态双向RNN的输出问题
2020/01/20 Python
python 基于卡方值分箱算法的实现示例
2020/07/17 Python
python实现邮件循环自动发件功能
2020/09/11 Python
使用CSS3滤镜的filter:blur属性制作毛玻璃模糊效果的方法
2016/07/08 HTML / CSS
英国女性时尚精品店:THE DRESSING ROOM
2018/05/23 全球购物
可打印的优惠券、杂货和优惠券代码:Coupons.com
2018/06/12 全球购物
毕业生自我推荐
2013/11/04 职场文书
教师求职信范文分享
2013/12/27 职场文书
学生会干部自荐信
2014/02/04 职场文书
《闻一多先生的说和做》教学反思
2014/04/28 职场文书
党员检讨书范文
2014/12/27 职场文书
升学宴家长答谢词
2015/09/29 职场文书
人事部:年度述职报告范文
2019/07/12 职场文书
html5表单的required属性使用
2021/07/07 HTML / CSS
关于Redis的主从复制及哨兵问题
2022/06/16 Redis