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 LoginSerializer

class 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 RefreshToken

class 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,include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('app/', include('app01.urls')),
]

# app01路由
from rest_framework.routers import SimpleRouter
from .views import UserView

router = 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 LoginAuthentication

class 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 UserInfo

class LoginAuthentication(BaseAuthentication):
    def authenticate(self, request):
        token = request.META.get('HTTP_TOKEN')  # 拿到token
        if 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,token
        else:
            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}

今日思维导图:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【小白专用】PHP识别是电脑或手机访问网站

现在通过手机访问网站越来越流行了,如果我们希望统计一下网站通过pc,手机移动端的各自访问量的情况,或者需要为手机移动端做一些特别的处理的话,那么我们就需要对访问网站的用户的客户端做一下鉴别了,下面这个实例就是…

vue2 消息弹框

父页面 <template><div style"margin-top: 20px"><div class"nav-style msg-style"><el-badge :value"value" :max"99" class"num" v-if"value > 0"><i class"el-icon-bell&…

关于开关量信号隔离器在水泥厂的应用探讨-安科瑞 蒋静

摘要&#xff1a;在水泥厂生产过程中&#xff0c;需要皮带与提升机进行运输物料&#xff0c;回转下料器进行投放物料。其中涉及大量电动机相关的机械运动&#xff0c;对这些机械运动状态进行检测&#xff0c;可以及时发现问题避免造成事故。针对机械位置检测&#xff0c;通常使…

Redis第四讲——Redis的数据库结构、删除策略及淘汰策略

一、redis中的数据库 redis服务器将所有数据库都保存在服务器状态redis.h/redisServer结构的db数组中。db数组的每项都是一个redis.h/redisDb结构&#xff0c;而每个redisDb结构就代表一个数据库。在初始化服务器时&#xff0c;程序会根据服务器状态的dbnum属性来决定应该创建多…

【shell漫步】2 运算符

碎碎念 上一章介绍了各种变量的定义和使用&#xff0c;这次要针对数字和文本这两种基本数据类型进行运算和判断了&#xff0c;shell中的运算包括&#xff1a; 对数字类型 算术运算&#xff08;对数字的 数学 运算&#xff09;关系运算&#xff08;用来做数字的条件判断&…

使用Go语言的HTTP客户端进行并发请求

Go语言是一种高性能、简洁的编程语言&#xff0c;它非常适合用于构建并发密集型的网络应用。在Go中&#xff0c;标准库提供了强大的HTTP客户端和服务器功能&#xff0c;使得并发HTTP请求变得简单而高效。 首先&#xff0c;让我们了解为什么需要并发HTTP请求。在许多应用场景中…

「Verilog学习笔记」任意奇数倍时钟分频

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 timescale 1ns/1nsmodule clk_divider#(parameter dividor 5) ( input clk_in,input rst_n,output clk_out );parameter CNT_WIDTH $clog2(dividor - 1) ; reg flag1, f…

「Verilog学习笔记」编写乘法器求解算法表达式

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 timescale 1ns/1nsmodule calculation(input clk,input rst_n,input [3:0] a,input [3:0] b,output [8:0] c);reg [8:0] data1, data2 ; assign c data2 ; always (posed…

基于ssm的订餐管理系统论文

基于JSP的订餐管理系统的设计与实现 摘要 当下&#xff0c;正处于信息化的时代&#xff0c;许多行业顺应时代的变化&#xff0c;结合使用计算机技术向数字化、信息化建设迈进。传统的订餐信息管理模式&#xff0c;采用人工登记的方式保存相关数据&#xff0c;这种以人力为主的…

微同城本地小程序源码系统:顺风车+二手市场+跑腿功能+信息发布+广告功能 带完整的搭建教程

随着移动互联网的普及&#xff0c;小程序已成为各行业进行线上业务拓展的重要工具。微同城作为一款集顺风车、二手市场、跑腿功能、信息发布和广告功能于一体的本地小程序源码系统&#xff0c;旨在满足现代城市居民的多元化需求&#xff0c;提供一个方便、快捷、实用的服务平台…

Linkage Mapper 工具参数详解——Building Network and Map Linkages

【小白一学就会无需其他教程】此文档用于解析使用Linkage Mapper 各输入输出参数详情以及可能的影响&#xff0c;并介绍了如何解释模型输出结果和输出参数&#xff0c;适合刚入手的人。篇幅很长很啰嗦&#xff0c;是因为每个参数都解释的万分细致。 从以下链接中获取内容&#…

FPGA——VIVADO生成固化文件,掉电不丢失

VIVADO生成固化文件 (1)加入代码(2)生成bin文件&#xff0c;并且下载 (1)加入代码 设计文件(.xdc)中加入这段代码: set_property CFGBVS VCCO [current_design] set_property CONFIG_VOLTAGE 3.3 [current_design] set_property BITSTREAM.GENERAL.COMPRESS true [current_de…

【SpringBoot】-Spring MVC详解

作者&#xff1a;学Java的冬瓜 博客主页&#xff1a;☀冬瓜的主页&#x1f319; 专栏&#xff1a;【Framework】 主要内容&#xff1a;SpringMVC项目的创建&#xff0c;关于使用SpringMVC框架前端传参和后端获取参数。关于SpringMVC框架后端返回数据的实战&#xff0c;如返回静…

1.2 ARCHITECTURE OF A MODERN GPU

图1.2显示了典型的支持CUDA的GPU架构的高级视图。它被组织成一系列高线程的流式多处理器&#xff08;SM&#xff09;。在图中1.2&#xff0c;两个SM构成一个 block。然而&#xff0c;构建块中的SM数量可能因代而异。此外&#xff0c;在图中&#xff0c;每个SM都有多个共享控制逻…

工作中人员离岗识别摄像机

工作中人员离岗识别摄像机是一种基于人工智能技术的智能监控设备&#xff0c;能够实时识别员工离岗状态并进行记录。这种摄像机通常配备了高清摄像头、深度学习算法和数据处理系统&#xff0c;可以精准地监测员工的行为&#xff0c;提高企业的管理效率和安全性。 工作中人员离岗…

医院信息系统集成平台—后台运维管理系统

随着信息化建设的推进,为了让凝聚了巨大人力物力投入的信息基础设施发挥出其效益,保障整个信息系统的平稳可靠运行,需要有一个可从整体上对包括服务器、网络,存储,安全等组件在内的IT基础设施环境进行综合管理的平台,并能够提供业务系统运行异常的实时告警和进行图形化问…

【Python】开始你的Python之旅(Anaconda、Pycharm、Jupyter)

Python工具准备 下载安装AnacondaPycharmJupyter Notebook 启动使用AnacondaPycharmJupyter Notebook 引言&#xff1a; 信息时代&#xff0c;计算机引领。人工智能&#xff0c;Python是基础。信息时代学习好Python乃是在人工智能时代的立足之本。 本文&#xff1a; 做好Pyth…

透明触摸屏展示柜的安装,需要注意什么

透明触摸屏展示柜的安装需要注意以下几个方面&#xff1a; 确定安装位置&#xff1a;选择一个合适的位置&#xff0c;确保展示柜的摆放位置合理&#xff0c;便于观看和管理。同时&#xff0c;要考虑到电源和信号线的连接&#xff0c;以及展示柜与周围环境的协调性。 检查透明触…

MYSQL多种提权方式

&#x1f419;MYSQL-提权条件 - 数据库的最高权限用户的密码 - secure-file-priv没进行目录限制 - 拿下了网站的权限&#xff08;通过webshell或者其他方式&#xff09; - 获取到了数据库的账号密码 &#xff08;获取密码&#xff1a;D:/phpstudy/MySQL/data/mysql/user.MYD…

【数据结构】——期末复习题库(6)

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…