过滤源码分析

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/'
        }]},}]
  
 posted on 2022-10-13 19:52  拾荒菇凉  阅读(88)  评论(0)    收藏  举报