DRF-Permission组件源码分析及改编源码

news/2025/3/11 10:02:14/文章来源:https://www.cnblogs.com/harry6/p/18508623

1. 权限组件源码分析

PS:下列源码为了方便理解都进行了简化,只保留了权限相关的代码


由于视图函数中继承了APIView,因此permission_classes可在视图类中进行重写。

注意点:
  • 执行权限校验前,已执行了认证流程。因此此时可通过self.user获取用户对象(认证通过的情况)
    image



2. 实践:编写一个权限类

假设我们在认证通过后,给每个用户对象都加上表示角色的属性role。1代表普通用户, 2代表经理, 3代表BOSS:

import random
from rest_framework.permissions import BasePermission
from rest_framework.request import Requestclass UserPermission(BasePermission):message = {"code": 1001, "detail": "无权限"}  # 无权限时返回的信息def has_permission(self, request, view):if request.user.role == 3:return Truereturn Falseclass ManagerPermission(BasePermission):message = {"code": 1001, "detail": "无权限"}  # 无权限时返回的信息def has_permission(self, request, view):if request.user.role == 2:return Truereturn Falseclass BossPermission(BasePermission):message = {"code": 1001, "detail": "无权限"}   # 无权限时返回的信息def has_permission(self, request, view):if request.user.role == 1:return Truereturn False



3. 源码改编

  • 将权限校验中的“且”改为“或”关系,即只要有一个权限类通过校验即代表权限校验通过,继续执行后续代码:
# 在视图类中重写源码中的check_permissions方法:def check_permissions(self, request):no_permission_objects = []  # 未通过校验的权限对象for permission in self.get_permissions():if permission.has_permission(request, self):# 只要有一个权限类通过校验则立即停止函数return else:no_permission_objects.append(permission)else:   # 所有权限类都未通过校验self.permission_denied(request,message=getattr(no_permission_objects[0], 'message', None),  code=getattr(no_permission_objects[0], 'code', None))
  • 若想要所有视图类能使用该重写的功能,可将该方法单独写成类(MyAPIView),并继承APIView;其他要使用该重写方法的视图不再继承APIView,而是继承MyAPIView
# utils.py
class MyAPIView(APIView):# 改写权限,变为"或"关系;def check_permissions(self, request):no_permission_objects = []  # 未通过校验的权限对象for permission in self.get_permissions():if permission.has_permission(request, self):# 只要有一个权限类通过校验则立即停止函数return else:no_permission_objects.append(permission)else:   # 所有权限类都未通过校验self.permission_denied(request,message=getattr(no_permission_objects[0], 'message', None),  code=getattr(no_permission_objects[0], 'code', None))# views.py
class UserView(APIView):  # 继承DRF的APIView,则权限判断为“且”的关系# 只有用户有权限permission_classes = [UserPermission]def get(self, request, pid):return Response("hello get")def post(self, request, pid):return Response({"nihao  post!"})class OrderView(MyAPIView):  # 用了自己改写的类MyAPIView,则权限判断为“或"的关系# 经理和BOSS都有权限permission_classes = [BossPermission, ManagerPermission]def get(self, request, pid):return Response("hello get")def post(self, request, pid):return Response({"nihao  post!"})

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/822828.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

attention跟一维卷积的区别是啥

attention机制和一维卷积都在深度学习领域中被广泛应用,但它们的核心思想、实现方式以及应用场景存在明显的区别。区别包括:1.核心思想不同;2.操作细节不同;3.参数量和计算复杂度不同;4.应用领域和场景的偏好不同;5.与时间序列的交互方式不同。1.核心思想不同 attention机…

position embedding和position encoding是什么有什么区别

Position Embedding是指在预训练的词向量中嵌入位置信息的过程,Position Encoding是用于注意力机制中的一种技术,用于为序列中的每个位置提供一个位置向量。二者的区别:1、作用方式不同;2、实现方法不同等。作用方式不同是指,前者是将位置信息嵌入到词嵌入向量中,后者是在…

友元(Friend)

友元(突破 private 限制) 友元函数 只要让函数 func 成为类 Men 的友元函数,那么 func 这个函数就能够访问类 Men 的所有成员(成员变量、成员函数),private、protected总结: 友元函数 func(。。。) 是个函数,通过声明为某个类 Men 的友元函数,它就能访问这个类(Men)…

2024-2025-1(20241321)《计算机基础与程序设计》第五周学习总结

这个作业属于哪个课程 <班级的链接>(2024-2025-1-计算机基础与程序设计)这个作业要求在哪里 <作业要求的链接>(2024-2025-1计算机基础与程序设计第一周作业)这个作业的目标 <了解并学习AI功能,回顾一周课程心得>作业正文 ... 本博客链接https://www.cnblo…

Web前端主流框架都有哪些

Web前端主流框架有:一、React;二、Angular;三、Vue.js;四、Ember.js;五、Backbone.js;六、Svelte;七、Next.js;八、Preact;九、Alpine.js;十、Stencil。React是一个由Facebook开发并维护的JavaScript库,被广泛应用于现代Web开发中,特别是单页面应用程序(SPA)的开…

CV方向多模态融合有哪些好的paper

在计算机视觉(CV)领域,多模态融合是一个热门的研究方向,下面列出了一些有代表性的研究论文:一、”Looking to Listen at the Cocktail Party”;二、”VQA: Visual Question Answering”;三、”Are You Looking? Grounding to Multiple Modalities in Vision-and-Langua…

边缘计算是什么

边缘计算作为一种新兴的计算模式,通过将计算资源推向数据源和终端设备的网络边缘,实现了低延迟、高安全性和分布式计算等优势。边缘计算在智能制造、智能交通、医疗健康等领域具有广阔的应用前景,但也需要解决安全风险、管理复杂性和标准化等挑战。一、边缘计算的定义 边缘计…

组网技术-vlan+DHCP组网[华为、华三]

配置概述如上图所示:LSW4是三层交换机,我们将会在LSW4上创建VLAN与DHCP服务 下面两台终端使用DHCP服务即可连接 由于有VLAN 因此默认两个终端是无法进行通信的,所以利用vlan接口的ip地址充当两台终端的网关,这样双方就能进行通信 左边:网络地址 192.168.1.0/24 网关 192.1…

机器学习有什么作用

以下是机器学习的一些主要作用:1、预测和分类;2、自动化和智能化;3、个性化推荐;4、图像和语音识别;5、自然语言处理;6、医疗诊断和治疗;7、金融风控;8、环境保护;机器学习可以通过对历史数据的学习,对未来的事件进行预测和分类。例如,根据过去的销售数据预测未来的…

Scrum和Kanban在敏捷开发中有什么区别

Scrum和Kanban在敏捷开发中的区别:1.团队协作与工作流程;2.任务管理与计划;3.变更应对和灵活性;4.工作量估算;5.反馈机制。Scrum注重团队协作、迭代开发,而Kanban更注重流程的可视化和持续优化。了解它们的不同之处,有助于团队选择最适合其需求的方法,提高项目管理的效…

Kafka学习笔记(已完结)

在kafka学习过程中的笔记记录Kafka消息中间件 官网:https://kafka.apache.org/ docker安装kafka教程:https://bugstack.cn/md/road-map/kafka.html Kafka的几个概念 生产者Producer 消费者Consumer 主题Topic分区Partition 一个topic下可以有多个分区。当创建topic时,如果补…

A 2-D LiDAR-SLAM Algorithm for Indoor Similar Environment With Deep Visual Loop Closure

具有深度视觉闭环的室内类似环境的二维 LiDAR-SLAM 算法 A 2-D LiDAR-SLAM Algorithm for Indoor Similar Environment With Deep Visual Loop Closure摘要:同步定位与建图(SLAM)是实现机器人智能的关键技术。与摄像头相比,在室内环境下使用光探测和测距(LiDAR)可以实现更…