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发送邮件示例(支持中文邮件标题)
Feb 16 Python
Python中序列的修改、散列与切片详解
Aug 27 Python
Python2.7下安装Scrapy框架步骤教程
Dec 22 Python
详谈Numpy中数组重塑、合并与拆分方法
Apr 17 Python
Python3实现爬虫爬取赶集网列表功能【基于request和BeautifulSoup模块】
Dec 05 Python
Python爬虫实战之12306抢票开源
Jan 24 Python
linux安装python修改默认python版本方法
Mar 31 Python
Python基础之函数基本用法与进阶详解
Jan 02 Python
Python3标准库之threading进程中管理并发操作方法
Mar 30 Python
python+selenium+chromedriver实现爬虫示例代码
Apr 10 Python
python 图像判断,清晰度(明暗),彩色与黑白实例
Jun 04 Python
Python通过fnmatch模块实现文件名匹配
Sep 30 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
CodeIgniter php mvc框架 中国网站
2008/05/26 PHP
Windows7下PHP开发环境安装配置图文方法
2010/05/20 PHP
PHP中的函数嵌套层数限制分析
2011/06/13 PHP
mod_php、FastCGI、PHP-FPM等PHP运行方式对比
2015/07/02 PHP
在PHP站点的页面上添加Facebook评论插件的实例教程
2016/01/08 PHP
浅谈thinkphp5 instance 的简单实现
2017/07/30 PHP
php删除一个路径下的所有文件夹和文件的方法
2018/02/07 PHP
在IE浏览器中resize事件执行多次的解决方法
2011/07/12 Javascript
JS判断对象是否存在的10种方法总结
2013/12/23 Javascript
jquery序列化表单以及回调函数的使用示例
2014/07/02 Javascript
js实现浏览器窗口大小被改变时触发事件的方法
2015/02/02 Javascript
JavaScript实现非常简单实用的下拉菜单效果
2015/08/27 Javascript
基于RequireJS和JQuery的模块化编程日常问题解析
2016/04/14 Javascript
浅析js绑定事件的常用方法
2016/05/15 Javascript
使用vue的v-for生成table并给table加上序号的实例代码
2017/10/27 Javascript
nodejs中Express与Koa2对比分析
2018/02/06 NodeJs
Python使用random和tertools模块解一些经典概率问题
2015/01/28 Python
使用Python压缩和解压缩zip文件的教程
2015/05/06 Python
python查找指定文件夹下所有文件并按修改时间倒序排列的方法
2018/10/21 Python
在Python中获取两数相除的商和余数方法
2018/11/10 Python
将python安装信息加入注册表的示例
2019/11/20 Python
python在不同条件下的输入与输出
2020/02/13 Python
Tkinter中复选菜单是否被选中的判断与设置方式
2020/03/04 Python
Python基于pandas绘制散点图矩阵代码实例
2020/06/04 Python
Python通过yagmail实现发送邮件代码解析
2020/10/27 Python
解决使用Pandas 读取超过65536行的Excel文件问题
2020/11/10 Python
详解Python 中的 defaultdict 数据类型
2021/02/22 Python
详解CSS3 用border写 空心三角箭头 (两种写法)
2017/09/29 HTML / CSS
学习党课思想汇报
2013/12/29 职场文书
2014年材料员工作总结
2014/11/19 职场文书
3.15消费者权益日活动总结
2015/02/09 职场文书
高三教师工作总结2015
2015/07/21 职场文书
卫生主题班会
2015/08/14 职场文书
成功的商业计划书这样写才最靠谱
2019/07/12 职场文书
为什么说餐饮很难做,是因为你不了解这些新规则
2019/08/20 职场文书
PostgreSQL并行计算算法及参数强制并行度设置方法
2022/04/07 PostgreSQL