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和shell变量互相传递的几种方法
Nov 20 Python
go和python调用其它程序并得到程序输出
Feb 10 Python
使用Python的Twisted框架实现一个简单的服务器
Apr 16 Python
python 专题九 Mysql数据库编程基础知识
Mar 16 Python
浅谈flask中的before_request与after_request
Jan 20 Python
python实现录音小程序
Oct 26 Python
python 获取微信好友列表的方法(微信web)
Feb 21 Python
TensorFlow dataset.shuffle、batch、repeat的使用详解
Jan 21 Python
社区版pycharm创建django项目的方法(pycharm的newproject左侧没有项目选项)
Sep 23 Python
5 分钟读懂Python 中的 Hook 钩子函数
Dec 09 Python
Python之京东商品秒杀的实现示例
Jan 06 Python
Pycharm 跳转回之前所在页面的操作
Feb 05 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+apache+php Linux安装指南
2006/10/09 PHP
解决PHP mysql_query执行超时(Fatal error: Maximum execution time …)
2013/07/03 PHP
Zend Framework入门教程之Zend_View组件用法示例
2016/12/09 PHP
php获取微信共享收货地址的方法
2017/12/21 PHP
PHP排序算法之基数排序(Radix Sort)实例详解
2018/04/21 PHP
jQuery子属性过滤选择器用法分析
2015/02/10 Javascript
jQuery实现的表格展开伸缩效果实例
2016/09/07 Javascript
jquery checkbox的相关操作总结
2016/10/17 Javascript
原生JS实现图片轮播切换效果
2016/12/15 Javascript
JS正则RegExp.test()使用注意事项(不具有重复性)
2016/12/28 Javascript
react实现pure render时bind(this)隐患需注意!
2017/03/09 Javascript
angularjs中$http异步上传Excel文件方法
2018/02/23 Javascript
微信小程序定位当前城市的方法
2018/07/19 Javascript
解决在vue项目中webpack打包后字体不生效的问题
2018/09/01 Javascript
解决JavaScript中0.1+0.2不等于0.3问题
2018/10/23 Javascript
vue实现放大镜效果
2020/09/17 Javascript
JavaScript实现网页跨年倒计时
2020/12/02 Javascript
在Python中通过threading模块定义和调用线程的方法
2016/07/12 Python
python实现简单聊天应用 python群聊和点对点均实现
2017/09/14 Python
零基础使用Python读写处理Excel表格的方法
2019/05/02 Python
Python 实现递归法解决迷宫问题的示例代码
2020/01/12 Python
基于python图书馆管理系统设计实例详解
2020/08/05 Python
解决pip安装tensorflow中出现的no module named tensorflow.python 问题方法
2021/02/20 Python
不可轻视HTML5!App三年内将被html5顶替彻底消失
2015/11/18 HTML / CSS
Lookfantastic希腊官网:英国知名美妆购物网站
2018/09/15 全球购物
如何写出好的Java代码
2014/04/25 面试题
入党转预备思想汇报
2014/01/07 职场文书
公司领导班子召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
红旗渠导游词
2015/02/09 职场文书
幼儿园园务工作总结2015
2015/05/18 职场文书
交通事故赔偿起诉书
2015/05/20 职场文书
朋友聚会祝酒词
2015/08/10 职场文书
2016年幼儿园庆六一开幕词
2016/03/04 职场文书
六年级作文之预言作文
2019/10/25 职场文书
Python机器学习之KNN近邻算法
2021/05/14 Python
Javascript设计模式之原型模式详细
2021/10/05 Javascript