drf知识--11

news2025/1/17 3:10:54

补充

# 研究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}

今日思维导图:

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【linux学习】linux概述

1. linux概述 操作系统主要的功能有两个部分,一是更有效率的控制计算机硬件资源(主要通过核心来控制),二是为程序设计师提供更容易开发软件的环境(系统呼叫提供软件开发环境)。linux就是一套操作系统&…

台灯学生用哪个牌子最好?学生护眼台灯最好的品牌推荐

如今的家长对教育十分重视,不仅给孩子提供了各种别致的文具,为了孩子有更好的学习光线,还会购买各种护眼台灯,但各种选择五花八门。从无蓝光、无频闪到柔和光,各种宣传亮点层出不穷……为了为孩子选购一款优质的学习护…

P3704数字表格(莫比乌斯反演)

题目背景 Doris 刚刚学习了 fibonacci 数列。用 fi​ 表示数列的第 i 项,那么 00,11f0​0,f1​1 fn​fn−1​fn−2​,n≥2 题目描述 Doris 用老师的超级计算机生成了一个 nm 的表格, 第 i 行第 j 列的格子中的数是 gcd(i,j)​,其中gcd(…

企业数据治理的三个阶段:从起步到成熟的数据管理之旅

随着数字化时代的到来,企业数据已经成为企业的重要资产和驱动业务发展的重要力量。然而,要想充分利用数据的价值,企业需要对其数据进行有效的管理和治理。本文将对企业数据治理的三个阶段进行详细的探讨,以帮助企业了解其在数据治…

5600U PVE安装WIN10后直通核显

修改PVE系统配置 请先安装相同版本的PVE系统,其他版本如果存在问题请自行查找。 安装过程比较简单,具体方法请自行百度 1. 修改grub启动参数: 修改文件 /etc/default/grub 中 GRUB_CMDLINE_LINUX_DEFAULT 配置: GRUB_CMDLINE_LI…

七款人体感应报警器电路图

人体感应报警器电路图(一) 人体发出的红外线波长在9~10um之间,属远红外线区。我们利用热释电红外传感器及信号处理集成电路,组装成一个人体红外线感应开关电路报警器,它能依靠人体发出的微量红外线进行开关…

一键减低PNG像素,轻松优化图片质量!

在数字时代,我们每天都要处理大量的图片文件,从网站设计、广告素材到社交媒体图片等。PNG作为一种常用的无损压缩格式,在保证图片质量的同时,也占用了较大的存储空间。为了优化存储空间和提高加载速度,我们需要对PNG图…

获取小红书笔记详情API调用说明(含请求示例参数说明)

前言 小红书,是一个引领全球时尚潮流的社交电商平台。在这里,你可以发现世界各地的优质好物,从美妆护肤、穿搭时尚,到家居生活、旅行美食,一切应有尽有。同时,这里也是一个分享生活点滴的平台,…

CPU平台做视频智能分析,Lnton视频分析平台不仅支持流分析,同时也支持图片分析了

LntonAIServer最新v1.0.09版本支持图片分析了,经过几个月的研发,在原有的视频流分析的基础上,我们终于支持大家都非常期待的图片分析功能了,图片分析的功能加上,能有利于很多场景的展开,比如在烟火、明厨亮…

蓝牙技术在智能交通系统中的革新与应用

随着科技的不断进步,蓝牙技术已经成为智能交通系统中的一项关键技术。其无线连接和低功耗的特性为交通管理和车辆通信提供了新的解决方案。本文将深入探讨蓝牙技术在智能交通系统中的应用,以及其对交通效率、安全性和用户体验的积极影响。 1. 蓝牙技术在…

5G工业物联网网关:连接未来的智能工业

在当今数字化时代,工业物联网正迅速崛起,并引领着全球工业的数字转型。而5G工业物联网网关作为实现IIoT的关键基础设施,在连接未来的智能工业中发挥着举足轻重的作用。 什么是5G工业物联网网关 5G工业物联网网关是连接工业设备和5G网络的关键…

“晨曦记账本:筛选特定时间段内的借款信息,管理更轻松!“

晨曦记账本,为您的财务记录带来前所未有的便捷!现在,我们推出了一项新功能,让您能够轻松筛选特定时间段内的借款信息。这不仅让您更轻松地管理借款记录,还能确保您的财务数据一目了然。 首先,我们要打开晨…

YOLOv8独家原创改进:新颖的Shape IoU结合 Inner-IoU,基于辅助边框的IoU损失的同时关注边界框本身的形状和尺度,小目标实现高效涨点

💡💡💡本文改进:一种新的Shape IoU方法结合 Inner-IoU,基于辅助边框的IoU损失的同时,更加关注边界框本身的形状和尺度来计算损失 💡💡💡对小目标检测涨点明显,在VisDrone2019、PASCAL VOC均有涨点 收录 YOLOv8原创自研 https://blog.csdn.net/m0_63774211/ca…

2024年您应该知道的 12个绝佳且免费的 AI 工具

2024年,人工智能的世界会继续让我们着迷。 这里收集了12 个免费的 AI 工具,其中大多数易于使用,还有一些复杂的。无论如何,AI 将会给我们的工作和生活带来巨大的改变,了解并掌握最适合自己的工作至关重要。 1、Adobe …

MySQL的CRUD操作函数介绍union和union all

目录 一. CRUD(增删改查) 1.1 SELECT(查询) 概念 语法 含义 1.2 INSERT(新增) 概念 语法 含义 1.3 UPDATE(修改) 语法 含义 1.4 DELETE(删除) 语…

Kotlin:Set其实是有插入的顺序?

MutableSet怎么能调用indexOf去获取它的插入顺序呢?参考官网Collections overview | Kotlin Documentationhttps://kotlinlang.org/docs/collections-overview.html#set翻不了墙的看下面 (MutableSet的默认实现是LinkedHashSet,LinkedHashSet…

接口自动化技巧

使用postman发送上传接口方法: pytest运行完很多warning信息,如何去掉? 接口自动化异常处理方法: pytest去掉warning提示 可以再pytest,ini文件设置过滤掉告警信息

静态网页设计——奥迪官网(HTML+CSS+JavaScript)

前言 声明:该文章只是做技术分享,若侵权请联系我删除。!! 使用技术:HTMLCSSJS 主要内容:①网站栏目设计说明。 网站为奥迪官网,由奥迪首页、奥迪车型(具体车型介绍)、…

8K超高清应用:输电线网智慧巡检提升巡视效率

电力安全关系国计民生,是国家安全的重要保障,因此确保电力线路系统的安全运行至关重要。电力线路系统整体分为三大板块:输电线路、变电站和配电线路。然而,由于自然灾害、人为破坏等因素影响,这三大板块的设备很容易发…

BERT(从理论到实践): Bidirectional Encoder Representations from Transformers【3】

这是本系列文章中的第3弹,请确保你已经读过并了解之前文章所讲的内容,因为对于已经解释过的概念或API,本文不会再赘述。 本文要利用BERT实现一个“垃圾邮件分类”的任务,这也是NLP中一个很常见的任务:Text Classification。我们的实验环境仍然是Python3+Tensorflow/Keras…