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辅助脚本(总结)
Jan 11 Python
教你使用python实现微信每天给女朋友说晚安
Mar 23 Python
Python实现的网页截图功能【PyQt4与selenium组件】
Jul 12 Python
python求解数组中两个字符串的最小距离
Sep 27 Python
python模拟菜刀反弹shell绕过限制【推荐】
Jun 25 Python
Python3 venv搭建轻量级虚拟环境的步骤(图文)
Aug 09 Python
深入浅析Python 函数注解与匿名函数
Feb 24 Python
基于打开pycharm有带图片md文件卡死问题的解决
Apr 24 Python
浅谈Keras参数 input_shape、input_dim和input_length用法
Jun 29 Python
python实现的web监控系统
Apr 27 Python
Python制作春联的示例代码
Jan 22 Python
Python字符串的转义字符
Apr 07 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
用libtemplate实现静态网页生成
2006/10/09 PHP
利用PHP抓取百度阅读的方法示例
2016/12/18 PHP
PHP 实现字符串翻转(包含中文汉字)的实现代码
2017/04/01 PHP
Laravel中服务提供者和门面模式的入门介绍
2017/11/06 PHP
javascript加号"+"的二义性说明
2013/03/04 Javascript
js控制web打印(局部打印)方法整理
2013/05/29 Javascript
js监听鼠标点击和键盘点击事件并自动跳转页面
2014/09/24 Javascript
NodeJS学习笔记之Connect中间件模块(二)
2015/01/27 NodeJs
javascript手工制作悬浮菜单
2015/02/12 Javascript
jquery.fastLiveFilter.js实现输入自动过滤的方法
2015/08/11 Javascript
Jquery ajax请求导出Excel表格的实现代码
2016/06/08 Javascript
js通过classname来获取元素的方法
2016/11/24 Javascript
微信小程序 swiper组件构建轮播图的实例
2017/09/20 Javascript
实例详解vue.js浅度监听和深度监听及watch用法
2018/08/16 Javascript
扫微信小程序码实现网站登陆实现解析
2019/08/20 Javascript
详解Nuxt.js 实战集锦
2019/11/19 Javascript
vue实现图片上传到后台
2020/06/29 Javascript
vue 数据操作相关总结
2020/12/17 Vue.js
[07:47]DOTA2国际邀请赛采访专栏:探访Valve总部
2013/08/08 DOTA
[56:41]iG vs Winstrike 2018国际邀请赛小组赛BO2 第二场
2018/08/17 DOTA
python在命令行下使用google翻译(带语音)
2014/01/16 Python
python sorted函数的小练习及解答
2019/09/18 Python
Pandas 缺失数据处理的实现
2019/11/04 Python
Python+OpenCV实现实时眼动追踪的示例代码
2019/11/11 Python
使用py-spy解决scrapy卡死的问题方法
2020/09/29 Python
初中英语教学反思
2014/01/25 职场文书
《哪吒闹海》教学反思
2014/02/28 职场文书
2014年预备党员学习两会心得体会
2014/03/17 职场文书
工商企业管理应届生求职信
2014/05/04 职场文书
授权委托书样本及填写说明
2014/09/19 职场文书
2014年最新离婚协议书范本
2014/10/11 职场文书
2014年党小组工作总结
2014/12/20 职场文书
英雄儿女观后感
2015/06/09 职场文书
地震捐款简报
2015/07/21 职场文书
办公室主任岗位竞聘书
2015/09/15 职场文书
MySQL日期时间函数知识汇总
2022/03/17 MySQL