drf知识--11

补充

# 研究simple-jwt提供的Token类:

        1、RefreshToken:生成refresh token的类
        2、AccessToken:生成refresh token的类
        3、Token:他们俩的父类
        4、str(RefreshToken的对象)---得到字符串 refresh token,Token类写了 __str__
        5、str(RefreshToken的对象.access_token)---得到字符串 access token,Token类写了 __str__,RefreshToken类中access_token是方法被包装成了数据属性,返回值是AccessToken的对象
        6、RefreshToken,AccessToken的对象,都能点出 payload 荷载
        7、RefreshToken,AccessToken的对象,都能通过中括号取出荷载中得值

# 魔法方法之 . 操作:
   点拦截: __getattr__、__setattr__
   对象.name        当name不存在就会触发__getattr__执行
   对象.name='xxx'            触发__setattr__

# 魔法方法之 [ ] 操作:
    [ ] 拦截:__getitem__、__setitem__
    对象['name']           当name不存在  触发__getitem__执行
    对象['name']='xxx'                触发__setitem__

基于自定义表签发token

# 自定义表签发token步骤:

        1、快速签发和认证
        2、定制返回格式和认证
        3、自定义登录和认证,自定义表,自定义认证类

# 视图类:
from rest_framework.decorators import action
from rest_framework.viewsets import GenericViewSet
from rest_framework.response import Response
from .serializer import LoginSerializerclass UserView(GenericViewSet):serializer_class = LoginSerializer# 127.0.0.1:8000/api/v1/user/login/@action(methods=['POST'], detail=False)def login(self, request):ser = self.get_serializer(data=request.data)ser.is_valid(raise_exception=True)return Response(ser.validated_data)
# 序列化类:
from rest_framework import serializers
from .models import UserInfo
from rest_framework.exceptions import APIException
from rest_framework_simplejwt.tokens import RefreshTokenclass LoginSerializer(serializers.Serializer):username = serializers.CharField()password = serializers.CharField()def validate(self, attrs):    # 只做校验username = attrs.get('username')password = attrs.get('password')user = UserInfo.objects.filter(username=username, password=password).first()if user:# 签发token,使用RefreshToken直接签发refresh = RefreshToken.for_user(user)return {'code': 100,'msg': '登录成功','username': username,# 'icon':user.icon,'access': str(refresh.access_token),'refresh': str(refresh)}else:raise APIException({'code': 999, '101': '用户名或密码错误'})
# 表模型:
class UserInfo(models.Model):username = models.CharField(max_length=32)password = models.CharField(max_length=32)age = models.IntegerField()gender = models.IntegerField(choices=((1, '男'), (2, '女'), (0, '未知')))
# 总路由:
from django.contrib import admin
from django.urls import path,includeurlpatterns = [path('admin/', admin.site.urls),path('app/', include('app01.urls')),
]# app01路由
from rest_framework.routers import SimpleRouter
from .views import UserViewrouter = SimpleRouter()
router.register('user', UserView, 'user')
urlpatterns = [
]
urlpatterns += router.urls

基于自定义表编写认证类

# 视图层:
from rest_framework.viewsets import GenericViewSet
from rest_framework.response import Response
from .auth import LoginAuthenticationclass BookView(GenericViewSet):# 自定义用户表,使用JWTAuthentication无法完成验证,必须自定义认证类# authentication classes = [JWTAuthentication]# permission_classes = [IsAuthenticated]# 自定义用户表,使用自定义认证类authentication_classes = [LoginAuthentication]def list(self, request):print(request.user.username)return Response('好大一个家~')
# 认证类:
from rest_framework.authentication import BaseAuthentication
from rest_framework.exceptions import APIException
from rest_framework_simplejwt.tokens import AccessToken
from .models import UserInfoclass LoginAuthentication(BaseAuthentication):def authenticate(self, request):token = request.META.get('HTTP_TOKEN')  # 拿到tokenif token:# 验证token是否合法,是否过期,是否被篡改,伪造try:validated_token = AccessToken(token)except Exception as e:raise APIException({'code':101,'msg':str(e)})# 取出用户id,根据id查出用户并返回# validated_token.payload['user_id']# validated_token['user_id']user = UserInfo.objects.filter(pk=validated_token['user_id']).first()return user,tokenelse:raise APIException({'code': 102, 'msg': 'token必须携带
模型层:
class Book(models.Model):name = models.CharField(max_length=32)price = models.IntegerField

权限控制

drf 中有权限控制:
1、acl权限控制:访问控制列表 Access Control List
    # 互联网,对外项目
    # 用户可以:           

user_id:1=[刷视频,评论,收藏,开直播]
user_id:2=[刷视频]



     # 权限类:根据当前登录用户,取出它所有权限,权限列表

                当前访问的比如是评论,如果有权限,返回True,没有权限,返回false
2、rabc权限控制 : 基于角色的访问控制 Role-Based Access Control
 # 公司内部项目,用户属于某个角色,角色跟权限有对应关系:
            *财务:张三、李四----发工资权限,扣工资权限
            *hr:  王铁锤、王五----招员工,开除员工
            *开发:张二蛋、李小红----看代码 开发代码,删除代码
            *总裁:zjq----查看公司财报
 # rbac表设计:
                用户表:用户和角色是    多对多
                角色表(部门,组): 角色和权限  多对多
                权限表:用户和权限:多对多
       总共6 张表,表示基于角色的访问控制:rbac+acl
 # django的后台管理就是基于rbac控制---auth下有些表:                

auth_user:# 用户表
auth_group:# 组表(角色)
auth_permission:# 权限表
auth_group_permissions # 组和权限中间表
auth_user_groups # 用户和组 中间表
auth_user_user_permissions# 用户和权限多对多中间表

 # 演示rbac权限控制:
       创建一个超级用户 root  123456 对网站有所有权限
       创建一个用户[张三],创建一个组[测试组1],给测试组1加权限[book的增删查改]
       张三登录,发现张三有 测试组1的所有权限
       新增用户李四,没有任何组,登录后没有任何权限
       把李四放到 测试组1 ,有测试组1的所有权限:查看图书,修改图书,删除图书
        李四增加一个新增图书权限:
                    新增图书权限 加入到 测试组1  张三也有这个权限,不好
                    单独给李四增加一个 新增图书权限 
3、ABAC:Attribute-Based Access Control,基于属性的访问控制       
   # 公司内部项目,所有项目几乎都要有rbac权限
   # 基于django的admin做二次开发,美化页面,混合
   # django+vue,实现基于rbac的访问控制
                django:django-vue-admin
                go:gin-vue-admin
                java:若依

练习题1

所有接口一分钟只能访问5次

练习题2

需求:任务管理系统
1.创建一个表,包括任务标题(title) 、任务描述(description) 、任务截止日期(deadline) ,任务开始时间(stattime),任务状态(status)
2.写接口,允许用户列出所有任务、查看单个任务详情、创建新任务、更新现有任务和删除任务。
    -查询所有:
    -查询单条
    -创建一条
    -更新一条
    -删除一条
3.实现分页功能,每页显示10条任务记录,可以使用size控制再多显示,但是最多不超过20条
4.添加任务搜索功能,用户可以通过任务标题或任务描述搜索任务。
    -自定义
5.将任务状态分为"待办"、"进行中"和"已完成",用户可以根据任务状态筛选任务。
    -choice字段
    -过滤 status=2
    -使用djagno-filter
6 可以按任务开始时间排序
    -自定义,使用内置的
 
7 自定义用户表,token表:username,password,age,active,usertype字段字段
8 写个登录,如果是active是false不允许登录
9 任务查询所有和查询单条接口,不需要登录就能访问
10 创建,更新和删除,必须登录才能操作
10 任务创建和更新,普通用户就可以操作
11 任务删除功能,只能超级管理员操作
12 超级管理员能锁定和解锁用户
    post请求:127.0.0.1:8080/ap1/v1/users/1/lock
    请求中携带 {lock:true/false}

今日思维导图:

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

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

相关文章

PyQt5-控件之QDialog(UI-业务分离搭建自定义xDialog)

1.继承QtWidgets.QWidget自定义对话框 继承于QtWidgets.QWidget自定义一个对话框类:SelectingDlg class SelectingDlg(QtWidgets.QWidget): def __init__(self): super(SelectingDlg, self).__init__() self.initUI() def initUI(self):s…

WMS仓储管理系统如何优化急料处理流程

在当今快速发展的商业环境中,企业的运营效率和供应链管理面临着前所未有的挑战。尤其在面对急料处理这一环节时,许多企业都感到力不从心。为了满足生产线的连续运作、确保客户订单的及时交付,WMS仓储管理系统的急料处理流程优化成为了关键。本…

【Spark精讲】Spark on Hive性能优化

目录 第一章 1.1 集群配置概述 1.2 集群规划概述 第二章 Yarn配置 2.1 Yarn配置说明 yarn.nodemanager.resource.memory-mb yarn.nodemanager.resource.cpu-vcores yarn.scheduler.maximum-allocation-mb yarn.scheduler.minimum-allocation-mb 第三章 Spark的配置说…

UG装配-引用集

引用集是控制组件的图素在装配体中显示与隐藏 装配体体环境控制组件显示与隐藏的四种方式 1、图层 2、引用集 3、隐藏命令 Ctrl B 4、抑制,取消此组件装配,但保留操作在导航器方便启用 引用集有两种类型 1、UG自动创建的引用集 2、用户定义的引…

HarmonyOS页面和自定义组件生命周期

页面和自定义组件生命周期 在开始之前,我们先明确自定义组件和页面的关系: 自定义组件:Component装饰的UI单元,可以组合多个系统组件实现UI的复用。页面:即应用的UI页面。可以由一个或者多个自定义组件组成&#xff…

迟来的扫雷游戏

今天我们讲如何用C语言编写出一个简单扫雷,扫雷也算是一个比较原始的游戏了吧,那么我们今天就来实现他! 首先我们要来缕一缕游戏框架 我们在代码中我们肯定会写许多函数来实现扫雷,那么我们为了简便看出游戏的运行逻辑&#xff0…

大创项目推荐 深度学习卷积神经网络垃圾分类系统 - 深度学习 神经网络 图像识别 垃圾分类 算法 小程序

文章目录 0 简介1 背景意义2 数据集3 数据探索4 数据增广(数据集补充)5 垃圾图像分类5.1 迁移学习5.1.1 什么是迁移学习?5.1.2 为什么要迁移学习? 5.2 模型选择5.3 训练环境5.3.1 硬件配置5.3.2 软件配置 5.4 训练过程5.5 模型分类效果(PC端) 6 构建垃圾…

力扣刷题-二叉树-构建树

106.从中序与后序遍历序列构造二叉树 根据一棵树的中序遍历与后序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 中序遍历 inorder [9,3,15,20,7] 后序遍历 postorder [9,15,7,20,3] 返回如下的二叉树: 思路 参考:…

探秘Spring Bean的秘境:作用域篇【beans 三】

欢迎来到我的博客,代码的世界里,每一行都是一个故事 探秘Spring Bean的秘境:作用域篇【beans 三】 前言单例作用域如何声明单例Bean:特点: 原型作用域如何声明原型Bean:特点: 会话作用域如何声明…

多台西门子PLC对接Oracle数据库,实现PLC与数据库双向数据通讯

智能网关IGT-DSER方便实现多台PLC与数据库之间的数据通讯,既可以读取PLC的数据上报到数据库,也可以从数据库查询数据后写入到PLC的寄存器。 网关安装在设备侧,与设备同时起停,不担心数据丢失;在断网、服务器维护上报数…

vue-动态高亮效果

个人练习&#xff0c;仅供参考 实现如下效果&#xff1a;点击某块&#xff0c;某块变成其他颜色。 具体实现代码&#xff1a; 上边&#xff1a; <template><div><h3 style"color: #f69">动态高亮效果</h3><hr> <!-- 对象 -->…

CodeWave智能开发平台--03--目标:应用创建--01模板创建依赖问题修改

摘要 本文是网易数帆CodeWave智能开发平台系列的第03篇&#xff0c;主要介绍了基于CodeWave平台文档的新手入门进行学习&#xff0c;实现一个完整的应用&#xff0c;本文主要完成模板创建时的依赖问题解决。 CodeWave智能开发平台的03次接触 CodeWave参考资源 网易数帆Code…