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 常用string函数详解
May 30 Python
回调函数的意义以及python实现实例
Jun 20 Python
Python轻量级ORM框架Peewee访问sqlite数据库的方法详解
Jul 20 Python
python 多进程共享全局变量之Manager()详解
Aug 15 Python
python绘制无向图度分布曲线示例
Nov 22 Python
Python3 全自动更新已安装的模块实现
Jan 06 Python
基于梯度爆炸的解决方法:clip gradient
Feb 04 Python
python使用QQ邮箱实现自动发送邮件
Jun 22 Python
django 获取字段最大值,最新的记录操作
Aug 09 Python
全面介绍python中很常用的单元测试框架unitest
Dec 14 Python
Python使用Opencv实现边缘检测以及轮廓检测的实现
Dec 31 Python
python opencv通过按键采集图片源码
May 20 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的分页功能
2007/03/21 PHP
php自动适应范围的分页代码
2008/08/05 PHP
PHP与SQL注入攻击防范小技巧
2011/09/16 PHP
使用PHP备份MYSQL数据的多种方法
2014/01/15 PHP
php查询ip所在地的方法
2014/12/05 PHP
PHP读书笔记整理_结构语句详解
2016/07/01 PHP
php curl中gzip的压缩性能测试实例分析
2016/11/08 PHP
利用 fsockopen() 函数开放端口扫描器的实例
2017/08/19 PHP
jquery选择器(常用选择器说明)
2010/09/28 Javascript
javascript自适应宽度的瀑布流实现思路
2013/02/20 Javascript
jquery中push()的用法(数组添加元素)
2014/11/25 Javascript
在JavaScript中处理数组之reverse()方法的使用
2015/06/09 Javascript
jquery.serialize() 函数语法及简单实例
2016/07/08 Javascript
jQuery实现带遮罩层效果的blockUI弹出层示例【附demo源码下载】
2016/09/14 Javascript
jquery dialog获取焦点的方法
2017/02/09 Javascript
配置nodejs环境的方法
2017/05/13 NodeJs
angular+webpack2实战例子
2017/05/23 Javascript
vue watch自动检测数据变化实时渲染的方法
2018/01/16 Javascript
微信小程序仿微信运动步数排行(交互)
2018/07/13 Javascript
Python判断变量是否已经定义的方法
2014/08/18 Python
python生成IP段的方法
2015/07/07 Python
python妙用之编码的转换详解
2017/04/21 Python
基于pycharm导入模块显示不存在的解决方法
2018/10/13 Python
详解python:time模块用法
2019/03/25 Python
Python画图实现同一结点多个柱状图的示例
2019/07/07 Python
简单了解python协程的相关知识
2019/08/31 Python
python 实现从高分辨图像上抠取图像块
2020/01/02 Python
HTML5 WebSocket实现点对点聊天的示例代码
2018/01/31 HTML / CSS
高级电工工作职责
2013/11/21 职场文书
闭幕式主持词
2014/04/02 职场文书
涉及车辆房产分割的离婚协议书范文
2014/10/12 职场文书
整改落实情况汇报材料
2014/10/29 职场文书
年终工作总结范文2014
2014/11/27 职场文书
毕业生个人自荐书
2015/03/05 职场文书
培训学校2015年度工作总结
2015/07/20 职场文书
python3 sqlite3限制条件查询的操作
2021/04/07 Python