当前位置: 首页 > news >正文

dir_day11

1 排序和过滤源码分析

继承了GenericAPIView+ListModelMixin,只要在视图类中配置filter_backends它就能实现过滤和排序

  • drf内置的过滤类(SearchFilter),排序类(OrderingFiler)
  • django-filter

过滤

内置过滤:特点模糊查找

from rest_framework.filters import SearchFilter


class BookViewSet(ViewSetMixin, ListAPIView):
    queryset = models.Book.objects
    serializer_class = BookModelSerializer
    authentication_classes = [LoginAuth, ]
    # throttle_classes = [IPThrottling, ]
    filter_backends = [SearchFilter]
    search_fields = ['name', 'price', ]
  • 第三方过滤:不支持模糊查询,是精准匹配
  • 1.安装三方插件
  • 2 使用模块 from django_filters.rest_framework import DjangoFilterBackend
    -3 在配置文件中配置(settings.py)
INSTALLED_APPS = [
    ...
    'django_filters',  # 需要注册应用,
]
  • 4 在视图中使用
class BookViewSet(ViewSetMixin, ListAPIView):
    queryset = models.Book.objects
    serializer_class = BookModelSerializer
    authentication_classes = [LoginAuth, ]
    filter_backends = [DjangoFilterBackend, ]
    filter_fields = ['name', 'price']

自定义:写一个类,继承BaseFilterBackend,重写filter_queryset,返回的qs对象,就是过滤或排序后的

from rest_framework.filters import BaseFilterBackend
from django.db.models import Q


class Myfilter(BaseFilterBackend):
    def filter_queryset(self, request, queryset, view):
        # 获取过滤参数
        qs_name = request.query_params.get('name')
        qs_price = request.query_params.get('price')
        # title__contains:精确大小写查询,SQL中-->like BINARY
        # 利用Q查询构造或关系
        if qs_name:
            queryset = queryset.filter(name__contains=qs_name)
        elif qs_price:
            queryset = queryset.filter(price__contains=qs_price)
        elif qs_name or qs_price:
            queryset = queryset.filter(Q(name__contains=qs_name) | Q(price__contains=qs_price))
        return queryset

排序

只有获取多有才涉及到排序

  • list办法
  def list(self, request, *args, **kwargs):
        # self.get_queryset()所有数据,经过了self.filter_queryset返回了qs
        # self.filter_queryset完成的过滤
        queryset = self.filter_queryset(self.get_queryset())
        # 如果有分页,走的分页----》视图类中配置了分页类
        page = self.paginate_queryset(queryset)
        if page is not None:
            serializer = self.get_serializer(page, many=True)
            return self.get_paginated_response(serializer.data)
	   # 如果没有分页,走正常的序列化,返回
        serializer = self.get_serializer(queryset, many=True)
        return Response(serializer.data)
  • self.filter_queryset完成了过滤,当前在视图类中,self是视图类的对象,去视图类中找没找到,去父类—》GenericAPIView—》filter_queryset
def filter_queryset(self, queryset):
            for backend in list(self.filter_backends):
                queryset = backend().filter_queryset(self.request, queryset, self)
            return queryset

总结:

-写的过滤类要重写filter_queryset,返回qs(过滤或排序后)对象
-后期如果不写过滤类,只要在视图类中重写filter_queryset,在里面实现过滤也可以

2 基于jwt的认证类

class JWTAuthentication(BaseAuthentication):
    def authenticate(self, request):
        # 放到头中:token-->HTTP_TOKEN   Authorization--->HTTP_AUTHORIZATION
        print(request.META)
        jwt_value = request.META.get('HTTP_TOKEN')
        # 验证token是否合法,jwt模块下一定有个验证token的函数
        try:
            payload = jwt_decode_handler(jwt_value)
        except jwt.ExpiredSignature:
            raise AuthenticationFailed('token过期了')
        except jwt.DecodeError:
            raise AuthenticationFailed('token解码失败')
        except jwt.InvalidTokenError:
            raise AuthenticationFailed('认证失败')
        # 执行到这,说明token合法,payload可以使用
        user_id = payload.get('user_id')
        user = UserInfo.objects.filter(pk=user_id).first()  # 每次都要查数据库,效率不太好
        return (user, jwt_value)
        # return (payload,jwt_value)

3 RBAC的介绍和使用

RBAC 是基于角色的访问控制(Role-Based Access Control )在 RBAC 中,

-权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限。
这就极大地简化了权限的管理。这样管理都是层级相互依赖的,权限赋予给角色,而把角色又赋予用户,这样的权限设计很清楚,管理起来很方便

RBAC权限管理的模式,最适合公司内部的管理系统,不适合对外互联网用户的系统

-用户:用户表
-角色(部门):角色表(部门表)
-权限:权限表

-所有权限都是存在权限表中一条条的记录(发工资,招聘员工,开员工,发布新版本,开董事会)
-权限是授予角色的(部门的),一个个角色,就是一条条记录(开发角色,hr角色,股东角色)
-用户:一个个用户是用户表中一条条记录,用户属于某个部门

-三个表之间的关系
	-用户和角色关系:多对多,中间表
    -角色和权限关系:多对多,中间表
    -5张表了
    	-用户表
        -角色表
        -权限表
        -用户和角色关联表
        -角色和权限关联表
        
        
-举例子:
用户表:
id     姓名 
1      张三
2      里斯
角色表
id    角色名称
1      hr角色
2      股东角色
3      开发角色
权限表
id   权限名词
1     发工资
2     招人
3     提交代码

#####张三要有提交代码的权限
用户和角色中间表:
id   角色id   用户id
1     3       1 
权限和角色的中间表
id    角色id   权限id
1       3       3

django的后台管理admin就自带了rbac的权限,通过auth模块实现的,比普通rbac更高级一些

-本来5张表
-django是6张表,用户和权限的多对多关系表(一个用户可以分配多个权限,一个权限可以给多个用户)
	-6张表了
    	-用户表
        -角色表
        -权限表
        -用户和角色关联表
        -角色和权限关联表
        -用户和权限的多对多关系表

-启用了admin和auth,这6张表就迁移进去了
auth_user # 用户表
auth_group # 角色,组,部门表
auth_permission # 权限表
auth_user_groups # 用户和角色中间表
auth_group_permissions # 角色跟权限中间表
auth_user_user_permissions#用户和权限的中间表

-之前很多公司写后台管理使用dajngo,使用django的admin二次开发,不用写权限了,快速加功能即可

-体验django admin的rbac的权限控制

4 ACL、RBAC、ABAC(PBAC,CBAC)权限控制的介绍

ACL(Access Control List,访问控制列表)

将用户或组等使用者直接与对象的权限对接。
-用户表,权限表,中间  给用户授予某些权限即可

RBAC(Role-Based Access Control,基于角色的访问控制)

将用户与角色对接,然后角色与对象的权限对接

RBAC+ACL django,公司用的比较多啊

ABAC(Attribute-Based Access Control,基于属性的访问控制)

ABAC(Attribute-Based Access Control,基于属性的访问控制)
又称为PBAC(Policy-Based Access Control,基于策略的访问控制)
CBAC(Claims-Based Access Control,基于声明的访问控制)

传统的ACL、RBAC的架构是
{subject,action,object},
而ABAC的架构是

  • {subject,action,object,contextual}且为他们添加了parameter(参数)。

  • subject属性:比如用户的年龄、部门、角色、威望、积分等主题属性。

  • action属性:比如查看、读取、编辑、删除等行为属性。

  • object属性:比如银行账户、文章、评论等对象或资源属性。

  • contextual属性:比如时段、IP位置、天气等环境属性。
    自行创建
    py

import casbin

e = casbin.Enforcer("./model.conf", "./policy.csv")

sub = "lqz"  # 想要访问资源的用户
obj = "book"  # 将要被访问的资源
act = "get"  # 用户对资源进行的操作


> 自己写acl的控制  当前用户id,去权限和用户表查询即可,有记录就是有权限
> 
> 自己写rbac 当前用户id,找到他的角色,根据角色拿出权限,判断当前访问有没有
> 
> 
> if e.enforce(sub, obj, act):
>     # 允许alice读取data1
>     print('有权限') else:
>     # 拒绝请求,抛出异常
>     print('没有权限')

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.csv

p,alice,data1,read
p,bob,data2,write
p,lqz,book,get

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

django admin自带了权限控制,但是是前后端混合的,我们可以二次开发,开发出公司内部的自动化运行,自动化测试,人事管理系统,订单系统。。。。样子不好看
对django admin进行美化
-xadmin(不用了,过时了)
-simpleui(正红)

基于drf+vue 自己写前后端分离的权限管理
go-vue-admin

相关文章:

  • 漫画 | 打死我也不学编译了!
  • 14天机器学习DAY1-5|线性回归原理小结
  • 飞机电子式模拟空速表的设计与制作
  • 机器学习笔记 - YOLOv7 论文简述与推理
  • webpack5学习笔记
  • CTFHub | 默认口令
  • Mysql中的锁分类:
  • 【JavaWeb】之JSP
  • 目标检测算法——YOLOv5结合ConvNeXt结构
  • 机器学习——多元梯度下降法
  • Win10自带超级截屏利器
  • 【如何拍出一条好的vlog】素材篇
  • axios--》axios初步操作
  • javaScript 防抖/节流,探索学习,对新手友好的内容
  • 【docker】dockerfile优化镜像大小
  • 【5+】跨webview多页面 触发事件(二)
  • 【Linux系统编程】快速查找errno错误码信息
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • C++11: atomic 头文件
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • JavaScript 是如何工作的:WebRTC 和对等网络的机制!
  • javascript数组去重/查找/插入/删除
  • ng6--错误信息小结(持续更新)
  • Node 版本管理
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • SpiderData 2019年2月16日 DApp数据排行榜
  • spring-boot List转Page
  • windows-nginx-https-本地配置
  • 初探 Vue 生命周期和钩子函数
  • 第十八天-企业应用架构模式-基本模式
  • 猫头鹰的深夜翻译:JDK9 NotNullOrElse方法
  • 说说动画卡顿的解决方案
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • 终端用户监控:真实用户监控还是模拟监控?
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • ​configparser --- 配置文件解析器​
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • #### golang中【堆】的使用及底层 ####
  • ###C语言程序设计-----C语言学习(6)#
  • #HarmonyOS:基础语法
  • #HarmonyOS:软件安装window和mac预览Hello World
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • (13):Silverlight 2 数据与通信之WebRequest
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (初研) Sentence-embedding fine-tune notebook
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (简单) HDU 2612 Find a way,BFS。
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • (图)IntelliTrace Tools 跟踪云端程序
  • **登录+JWT+异常处理+拦截器+ThreadLocal-开发思想与代码实现**
  • .ai域名是什么后缀?