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实现从订阅源下载图片的方法
Mar 11 Python
使用Python编写提取日志中的中文的脚本的方法
Apr 30 Python
Python2实现的LED大数字显示效果示例
Sep 04 Python
python通过opencv实现批量剪切图片
Nov 13 Python
Python3简单实例计算同花的概率代码
Dec 06 Python
Python tkinter label 更新方法
Oct 11 Python
Python判断一个list中是否包含另一个list全部元素的方法分析
Dec 24 Python
在python3中pyqt5和mayavi不兼容问题的解决方法
Jan 08 Python
pygame实现俄罗斯方块游戏(AI篇1)
Oct 29 Python
tensorflow实现打印ckpt模型保存下的变量名称及变量值
Jan 04 Python
python 爬取疫情数据的源码
Feb 09 Python
Python的3种运行方式:命令行窗口、Python解释器、IDLE的实现
Oct 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
php封装的验证码类分享
2017/02/26 PHP
javascript void(0)的妙用
2009/10/21 Javascript
JavaScript中常用的运算符小结
2012/01/18 Javascript
点击按钮自动加关注的代码(sina微博/QQ空间/人人网/腾讯微博)
2014/01/02 Javascript
JavaScript实现将数组中所有元素连接成一个字符串的方法
2015/04/06 Javascript
Jquery数字上下滚动动态切换插件
2015/08/08 Javascript
Node.js中process模块常用的属性和方法
2016/12/13 Javascript
angularjs之$timeout指令详解
2017/06/13 Javascript
vue如何安装使用Quill富文本编辑器
2018/09/21 Javascript
JS几个常用的函数和对象定义与用法示例
2020/01/15 Javascript
JS Web Flex弹性盒子模型代码实例
2020/03/10 Javascript
Bootstrap实现前端登录页面带验证码功能完整示例
2020/03/26 Javascript
JS寄快递地址智能解析的实现代码
2020/07/16 Javascript
如何在面试中手写出javascript节流和防抖函数
2020/10/22 Javascript
[00:09]DOTA2全国高校联赛 精彩活动引爆全场
2018/05/30 DOTA
[01:04:32]DOTA2-DPC中国联赛 正赛 Aster vs LBZS BO3 第二场 2月23日
2021/03/11 DOTA
用Python和MD5实现网站挂马检测程序
2014/03/13 Python
python threading模块操作多线程介绍
2015/04/08 Python
Python运算符重载详解及实例代码
2017/03/07 Python
Python查询IP地址归属完整代码
2017/06/21 Python
Python正则捕获操作示例
2017/08/19 Python
使用Python实现博客上进行自动翻页
2017/08/23 Python
python3+dlib实现人脸识别和情绪分析
2018/04/21 Python
如何使用pyinstaller打包32位的exe程序
2019/05/26 Python
Python 实现判断图片格式并转换,将转换的图像存到生成的文件夹中
2020/01/13 Python
Python绘制全球疫情变化地图的实例代码
2020/04/20 Python
Canvas globalCompositeOperation
2018/12/18 HTML / CSS
定制iPhone和Macbook保护壳:Slick Case
2018/11/21 全球购物
主题实践活动总结
2014/05/08 职场文书
办公室行政主管岗位职责
2015/04/09 职场文书
中国古代史学名著《战国策》概述
2019/08/09 职场文书
2019最新版劳务派遣管理制度
2019/08/16 职场文书
学会用Python实现滑雪小游戏,再也不用去北海道啦
2021/05/20 Python
MongoDB orm框架的注意事项及简单使用
2021/06/20 MongoDB
vue使用refs获取嵌套组件中的值过程
2022/03/31 Vue.js
Python使用pandas导入xlsx格式的excel文件内容操作代码
2022/12/24 Python