首页 > 其他分享 >drf-11

drf-11

时间:2022-10-13 20:01:42浏览次数:32  
标签:11 filter -- self queryset --- 权限 drf

目录

过滤源码分析

1、过滤源码分析

1.内置过滤类:
  1.1 过滤--针对查询所有--视图类继承GenericAPIView+ListModelMixin
  1.2 在视图类中配置:filter_backends=[SearchFilter, ]  # SearchFilter过滤类
				   search_fields=[过滤字段]
  1.3 ListModelMixin重写了list方法--找到GenericAPIView的filter_queryset方法
      从filter_backends获取过滤字段通过for循环进行过滤 最后将过滤后的字段返回
    def filter_queryset(self, queryset):
        for backend in list(self.filter_backends):
            queryset = backend().filter_queryset(self.request, queryset, self)
        return queryset
  1.4 SearchFilter通过filter_queryset方法从视图类中拿到search_fields的过滤字段
    def filter_queryset(self, request, queryset, view):
        search_fields = self.get_search_fields(view, request)
        search_terms = self.get_search_terms(request)
        return queryset
2.自定义过滤类
  写一个类继承BaseFilterBackend---重写filter_queryset方法
  获取字段进行数据筛选之后将数据返回
    

排序源码分析

2.排序源码分析

1.内置排序类:
  1.1 排序--针对查询所有--视图类继承GenericAPIView+ListModelMixin
  1.2 在视图类中配置:filter_backends=[OrderingFilter, ]  # SearchFilter过滤类
				   ordering_fields=[筛选字段,]
  1.3 ListModelMixin重写了list方法--找到GenericAPIView的filter_queryset方法
      从filter_backends获取过滤字段通过for循环进行过滤 最后将过滤后的字段返回
    def filter_queryset(self, queryset):
        for backend in list(self.filter_backends):
            queryset = backend().filter_queryset(self.request, queryset, self)
        return queryset
  1.4 OrderingFilter通过filter_queryset方法从视图类中拿到ordering_fields的过滤字段
      排序后将数据返回
      def filter_queryset(self, request, queryset, view):
        ordering = self.get_ordering(request, queryset, view)
        if ordering:
            return queryset.order_by(*ordering)
        return queryset
 2.自定义排序类
  写一个类继承BaseFilterBackend---重写filter_queryset方法
  获取字段进行数据排序之后将数据返回

注:过滤与排序可以互相配合

基于jwt的认证类

1.写一个认证类--继承BaseAuthentication
2.获取token值 进行解码 判断返回数据
3.视图类配置
认证类:
class UserAuthentication(BaseAuthentication):
    def authenticate(self, request):
        jwt_value = request.META.get('HTTP_TOKEN')
        if jwt_value is None:
            return None
        try:
            payload = jwt_decode_handler(jwt_value)
        except ExpiredSignature:
            raise exceptions.AuthenticationFailed('token过期')
        except DecodeError:
            raise exceptions.AuthenticationFailed('解码错误')
        except InvalidTokenError:
            raise exceptions.AuthenticationFailed('其他错误')
        user_id = payload.get('user_id')
        return (user_id, jwt_value)
视图类: 
class BookView(ModelViewSet):
    queryset = Book.objects.all()
    serializer_class = BookSerializers
    authentication_classes = [UserAuthentication, ]

RBAC、ALC、ABAC(PBAC、CBAC)权限控制

一、RBAC--Role-Based Access Control---基于角色的访问控制
    权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限。这就极大地简化了权限的管理。这样管理都是层级相互依赖的,权限赋予给角色,而把角色又赋予用户,这样的权限设计很清楚,管理起来很方便
1.django的RBAC---适用于公司内部的管理系统---使用它不用写权限
  1.1 涉及表
      用户:用户表
      角色(部门):角色表
      权限:权限表
  1.2 表关系
      用户--角色--多对多
      角色--权限--多对多
      用户--角色--多对多
  1.3 表---6张表---通过auth表迁移自动生成(makemigrations/migrate)
      用户表---auth_user
      角色表---auth_group
      权限表---auth_permission
      用户角色多对多关联表---auth_user_groups
      角色权限多对多关联表---auth_group_permissions
      用户权限多对多关联表---auth_user_user_permission
2.普通RBAC---适用于公司内部的管理系统
  1.1 涉及表
      用户:用户表
      角色(部门):角色表
      权限:权限表
  1.2 表关系
      用户--角色--多对多
      角色--权限--多对多
   1.3 表---5张表
      用户表
      角色表
      权限表
      用户角色多对多关联表
      角色权限多对多关联表
二、ACL---Access Control List---访问控制列表--使用与互联网系统
    将用户或组等使用者直接与对象的权限对接
    用户表、权限表、中间表--给用户授予某些权力
三、ABAC---Attribute-Based Access Control---基于属性的访问控制
    又称为PBAC---Policy-Based Access Control---基于策略的访问控制
    又称为CBAC---Claims-Based Access Control---基于声明的访问控制
四、架构:
    1. 传统ACL与RBAC的架构:{subject,action,object},
    2. ABAC架构:{subject,action,object,contextual}+parameter(参数)
    subject属性:比如用户的年龄、部门、角色、威望、积分等主题属性。
    action属性:比如查看、读取、编辑、删除等行为属性。
    object属性:比如银行账户、文章、评论等对象或资源属性。
    contextual属性:比如时段、IP位置、天气等环境属性。
注:公司用的较多的是:RBAC+ACL=django的RBAC

快速做权限控制---casbin

1.casbin模型:又称PERM模型
配置文件:model.conf
[request_definition]
r = sub, obj, act

[policy_definition]
p = sub, obj, act

[policy_effect]
e = some(where (p.eft == allow))

[matchers]
m = r.sub == p.sub && r.obj == p.obj && r.act == p.act
配置文件:policy
p,lili,book,read
p,bob,data2,write
操作:
import casbin
e = casbin.Enforcer("./model.conf", "./policy.csv")
sub = "lili"  # 想要访问资源的用户
obj = "book"  # 将要被访问的资源
act = "read"  # 用户对资源进行的操作

if e.enforce(sub, obj, act):
    # 允许alice读取data1
    print('有权限')
else:
    # 拒绝请求,抛出异常
    print('没有权限')

后台管理-simplui的介绍和使用

1.下载:pip3 install django-simpleui
2.创建超级管理员:createsuperuser
3.admin中注册:
admin.site.register(User)
 @admin.register(Publish)
 class EmployeAdmin(admin.ModelAdmin):
     list_display = ('id', 'name', 'address')
admin.site.register(Publish)
4.配置文件中配置
import time
SIMPLEUI_CONFIG = {
    'system_keep': False,
    'menu_display': ['首页', '图书管理系统],      # 开启排序和过滤功能, 不填此字段为默认排序和全部显示, 空列表[] 为全部不显示.
    'dynamic': True,    # 设置是否开启动态菜单, 默认为False. 如果开启, 则会在每次用户登陆时动态展示菜单内容
    'menus': [{
        'name': '首页',
        'icon': 'fas fa-code',
        'url': '/index/',
        # 浏览器新标签中打开
        'newTab': True,
    },
        {
        'app': 'app01',
        'name': '图书管理系统',
        'icon': 'fas fa-user-shield',
        'models': [
            {
            'name': '用户',
            'icon': 'fa fa-user',
            'url': 'app01/user/'
        },
            {
            'name': '图书',
            'icon': 'fa fa-user',
            'url': 'app01/book/'
        },
            {
            'name': '出版社',
            'icon': 'fa fa-user',
            'url': 'app01/publish/'
        }]},}]
  

标签:11,filter,--,self,queryset,---,权限,drf
From: https://www.cnblogs.com/040714zq/p/16789462.html

相关文章

  • day11事件上
    事件事件名(内置的)执行对象(元素对象)处理函数(自定义函数)观察者(js的事件引擎)事件名的分类鼠标事件(鼠标触发)click单击事件dblclick双击事件mousedown按下mouseup......
  • 工控资讯 | 众志成城 战“疫”到底,科氏130亿收购Infor,西门子11亿欧元豪购,长城3亿美元
    01新冠疫情武汉封城19天致敬英雄​截至2月10日19时,现有确诊病例40261例,累计死亡909例,累计治愈出院3494例,现有疑似病例23589例。哪有从天而降的英雄,只有挺身而出的凡人!做好......
  • 【DSP视频教程】DSP视频教程第3期:学习Matlab常用技能,掌握定点数和浮点数表达和存储方
    ​​​​ 本期视频为大家分享DSP视频教程第3期:学习Matlab常用技能,掌握定点数和浮点数表达和存储方式的重要概念。理解透浮点数和定点数是DSP学习非常重要的一个环节。视频......
  • 《安富莱嵌入式周报》第274期:2022.07.11--2022.07.17
    ​​​​ 本周更新一期视频教程:BSP视频教程第20期:串口专题之玩转HAL库,LL库和寄存器方式实现方法以及参考手册几个关键时序图学习视频版:​​https://www.bilibili.com/video......
  • oracle11204rac更换ASM存储
    介绍迁移的简单过程。步骤如下:1、划分asmdisk,并检查或更改udev配置文件,使得新存储的asmdisk对asm实例可识别。2、备份OCR、Votingdisk、ASMdiskheader和数据库;......
  • drf之rabc,后台管理simplui
    一、过滤类和排序类源码分析#我们之前在学习排序和过滤类的时候是在继承了GenericAPIView+ListModelMixin的视图类中才能够配置的#然后在视图类中的filter_backends......
  • F118校准步骤(一)-- 安装CA310驱动程序及SDK
    下载Ca310_drv.zip文件并解压,备用。 http://www.xk-image.com/download/blog/0001_F118校准/Ca310_drv.zip准备好CA310设备: 连接电源,探头,以及USB接口(USB线另一端连接......
  • Debian11管理员手册
    1用户与群组数据库用户清单通常保存在/etc/passwd文件内,把哈希编码后的密码保存在/etc/shadow文件内。这两个文件都是纯文本档,以简单的格式保存,可以用文本编辑器读取......
  • 《安富莱嵌入式周报》第241期:2021.11.22--2021.11.28
     ​​​​ 1、【硬件设计开源盛宴】一年一度的hackaday大赛结束,奖金池10万美元,共450件电子作品​​​https://hackaday.io/contest/179533-supplyframe-designlab-2021-ha......
  • 【JS】11-前端HTML5几种存储方式的总结
    接下来要好好总结一些知识,秋招来啦。。。虽然有好多知识都不大会,但是还是要努力一下,运气这种东西,谁知道呢~总体情况h5之前,存储主要是用​​cookies​​​。​​cookies​​......