django restframework permission
与 authentication 和 throttling 一起,permission 决定是应该接受还是拒绝访问请求。
权限检查总是在视图的最开始处运行,在任何其他代码被允许进行之前。权限检查通常会使用 request.user 和 request.auth 属性中的认证信息来确定是否允许传入请求。
权限用于授予或拒绝不同类别的用户访问 API 的不同部分。
最简单的权限是允许通过身份验证的用户访问,并拒绝未经身份验证的用户访问。这对应于 REST framework 中的 IsAuthenticated 类。
稍微宽松的权限会允许通过身份验证的用户完全访问,而未通过身份验证的用户只能进行只读访问。这对应于 REST framework 中的 IsAuthenticatedOrReadOnly 类。
设置权限策略
默认权限策略可以使用 DEFAULT_PERMISSION_CLASSES setting 全局设置。例如
- REST_FRAMEWORK = {
- 'DEFAULT_PERMISSION_CLASSES': (
- 'rest_framework.permissions.IsAuthenticated',
- )
- }
如果未指定,则此设置默认为允许无限制访问:
- 'DEFAULT_PERMISSION_CLASSES': (
- 'rest_framework.permissions.AllowAny',
- )
当然也可以基于 APIView 类的视图上设置身份验证策略
查看源码,restframework现成的类有7个,介绍如下常用四个
AllowAny:允许无限制访问
IsAuthenticated :允许访问任何经过身份验证的用户,并拒绝访问任何未经身份验证的用户
IsAdminUser:允许超级用户访问
IsAuthenticatedOrReadOnly:对经过身份验证的用户的允许完全访问,但对未经身份验证的用户的允许只读访问
- @six.add_metaclass(BasePermissionMetaclass)
- class BasePermission(object):
- """
- A base class from which all permission classes should inherit.
- """
- def has_permission(self, request, view):
- """
- Return `True` if permission is granted, `False` otherwise.
- """
- return True
- def has_object_permission(self, request, view, obj):
- """
- Return `True` if permission is granted, `False` otherwise.
- """
- return True
但完全可以我们自己来写,仅需要面向上述源码任意一个接口即可。
apps/app/permissions.py
- from rest_framework.permissions import BasePermission
- class IsLoginReadOnly(BasePermission):
- """
- 自定义权限设置
- """
- def has_permission(self,request,view):
- return all((request.user.is_authenticated,request.user.is_staff))
如果你需要测试请求是读取操作还是写入操作,则应该根据常量SAFE_METHODS
检查请求方法,SAFE_METHODS
是包含'GET'
, 'OPTIONS'
和'HEAD'
的元组
- if request.method in permissions.SAFE_METHODS:
- # 检查只读请求的权限
- else:
- # 检查读取请求的权限
views.py
- from rest_framework import mixins
- from rest_framework import viewsets
- from .models import UserProfile
- from .serializers import UserProfileSerializer
- from .permissions import IsAuthenticatedOrReadOnly
- class UsersListViewSets(viewsets.GenericViewSet,mixins.ListModelMixin):
- """
- 用户列表
- """
- queryset = UserProfile.objects.all()
- serializer_class = UserProfileSerializer
- permission_classes = (IsAuthenticatedOrReadOnly,)
对象级权限
实际场景下,我们往往需要对权限细分:
POST 请求要求用户对模型实例具有 add 权限。
PUT 和 PATCH 请求要求用户对模型实例具有 edit 权限。
DELETE 请求要求用户对模型实例具有 delete 权限。
这就需要我们重写APIView下的has_permissions方法
views.py
- from .permission import UserAddPermission
- from .permission import UserDeletePermission
- from .permission import UserEditPermission
- from .permission import UserQueryPermission
- # permission_classes = (UserQueryPermission,)
- def get_permissions(self):
- if self.action == "create":
- self.permission_classes = (UserAddPermission,)
- elif self.action == "list":
- self.permission_classes = (UserQueryPermission,)
- elif self.action == "update":
- self.permission_classes = (UserEditPermission,)
- elif self.action == "destroy":
- self.permission_classes = (UserDeletePermission,)
- return super().get_permissions()
permission.py
- class UserAddPermission(BasePermission):
- """
- 增加用户权限
- """
- def has_permission(self, request ,view):
- user = request.user
- if user.is_authenticated:
- permissons = user.has_permissons()
- return "add user" in permissons
遇到了问题,即使UsersListViewSets继承了viewsets.ModelViewSet,该接口依旧只允许GET, POST, HEAD, OPTIONS四种方法,
没有put和delete.
解决:自己手动绑定。。。
- def put(self, request, *args, **kwargs):
- return self.update(request, *args, **kwargs)
- def delete(self,request, *args, **kwargs):
- return self.destroy(request, *args, **kwargs)
django restframework permission的更多相关文章
- django restframework
一.django restframework 请求流程源码剖析 上面的认证一个流程是rest_framework的关于APIauth的认证流程,,这个流程试用权限.频率.版本.认证.这个四个组件都是通 ...
- django restframework 的日常使用
本文讨论 django restframework 的日常使用,满足常用 api 编写的需求,比如 List, Detail, Update, Put, Patch 等等.探讨 django rest ...
- django restframework serializer 增加自定义字段
在使用django restframework serializer 序列化在django中定义的model时,有时候我们需要额外在serializer中增加一些model中没有的字段.有两种方法实现 ...
- django restframework jwt
既然要来学习jwt(json web token),那么我们肯定是先要了解jwt的优势以及应用场景--跨域认证. $ pip install djangorestframework-jwt 传统coo ...
- django restframework 快速入门
django restframework 快速入门 基本流程 建立 Models 依靠 Serialiers 将数据库取出的数据 Parse 为 API 的数据(可用于返回给客户端,也可用于浏览器显示 ...
- Django Restframework 实践(一)
具备以下知识: django http://www.cnblogs.com/menkeyi/p/5882464.html http://www.cnblogs.com/menkeyi/p/588245 ...
- django: rest-framework的 分页和过滤
django: rest-framework的 分页和过滤 2018年06月28日 10:09:01 weixin_42359464 阅读数:136 标签: flaskrestframeworkdja ...
- Django RestFramework (DRF)
准备: 下载 pip install djangorestframework 一 APIView源码解析 1 预备知识 CBV(class based view)FBV(function based ...
- 测开大佬告诉你:如何5分钟快速创建restful风格的API接口-使用django restframework框架
一.思考❓❔ 1.创建API接口难吗? 软件测试工程师: 只测过API接口, 从没创建过 应该需要掌握一门后端开发语言和后端开发框架吧!? 脑容量有限,想想就可怕 2.如何创建API接口呢? 使用Dj ...
随机推荐
- 可视化设计,类Excel的快速开发平台
活字格Web应用生成器,是可视化设计,类Excel的快速开发平台,接下来给大家介绍如何体现这些特点. 一.可视化设计 网页系统的开发,包含UI设计+代码编写的工作,最终形成网页系统.这要求系统开发人员 ...
- JavaWeb 消息总线框架 Saka V0.0.1 发布
端午闲着无聊,自己撸了一个简单的框架,可以实现在使用SendClient发送消息,在Spring容器中,符合该消息机制的接收器将能够被执行,目前Saka处于0.0.1版本[Saka-GIthub地址( ...
- linux下的qt串口通信
1.linux下的qt串口通信跟windows唯一的差别就是端口号的名字,windows下面是COM,而linux是ttyUSB0的路径 2.一般情况下linux插上USB转串口线就可以在/dev/目 ...
- react基础语法二
这里只是对自己的学习进行一次总结,也是为了让自己以后如果长时间不使用快速记忆起来的笔记,如果想要学习,还是去官网看文档比较好一些.. 注意 下面的代码的 script标签的type类型都为 “text ...
- c/c++ 多线程 等待一次性事件 packaged_task用法
多线程 等待一次性事件 packaged_task用法 背景:不是很明白,不知道为了解决什么业务场景,感觉std::asynck可以优雅的搞定一切,一次等待性事件,为什么还有个packaged_tas ...
- MySQL:1366 - Incorrect string value错误解决办法
今天使用navicat向MySQL中插入中文时,报错: - Incorrect string value:... 在我自己数据库设计之初,没有设计好字符编码格式的问题. 使用如下语句解决: alter ...
- 与非java语言使用RSA加解密遇到的问题:algid parse error, not a sequence
遇到的问题 在一个与Ruby语言对接的项目中,决定使用RSA算法来作为数据传输的加密与签名算法.但是,在使用Ruby生成后给我的私钥时,却发生了异常:IOException: algid parse ...
- 超哥笔记 -- 用户管理、权限设置、进程管理、中文配置、计划任务和yum源配置(5)
一 网卡配置 ifconfig 查询.设置网卡和ip等参数 ifup,ifdown 脚本命令,更简单的方式启动关闭网络 ip 符合指令,直接修改上述功能 网络配置文件: /etc/sysconf ...
- 【Python 12】汇率兑换5.0(Lambda函数)
1.案例描述 设计一个汇率换算程序,其功能是将美元换算成人民币,或者相反. 2.0增加功能:根据输入判断是人民币还是美元,进行相应的转换计算 3.0增加功能:程序可以一直运行,知道用户选择退出 4. ...
- 关于出现Specified VM install not found: type Standard VM, name jdk1.5.0_04问题的解决办法
问题出现背景: 今天把原来电脑中的jdk版本由1.7换到了1.8,,重新在Eclipse中配置环境后出现了此问题 问题解决办法: 在你的项目中,选中ant文件,右键>>Run As > ...