drf知识--11

2024-01-05 05:12
文章标签 知识 drf

本文主要是介绍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}

今日思维导图:

这篇关于drf知识--11的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/571753

相关文章

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程

一文详解Java异常处理你都了解哪些知识

《一文详解Java异常处理你都了解哪些知识》:本文主要介绍Java异常处理的相关资料,包括异常的分类、捕获和处理异常的语法、常见的异常类型以及自定义异常的实现,文中通过代码介绍的非常详细,需要的朋... 目录前言一、什么是异常二、异常的分类2.1 受检异常2.2 非受检异常三、异常处理的语法3.1 try-

国内环境搭建私有知识问答库踩坑记录(ollama+deepseek+ragflow)

《国内环境搭建私有知识问答库踩坑记录(ollama+deepseek+ragflow)》本文给大家利用deepseek模型搭建私有知识问答库的详细步骤和遇到的问题及解决办法,感兴趣的朋友一起看看吧... 目录1. 第1步大家在安装完ollama后,需要到系统环境变量中添加两个变量2. 第3步 “在cmd中

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

sqlite3 相关知识

WAL 模式 VS 回滚模式 特性WAL 模式回滚模式(Rollback Journal)定义使用写前日志来记录变更。使用回滚日志来记录事务的所有修改。特点更高的并发性和性能;支持多读者和单写者。支持安全的事务回滚,但并发性较低。性能写入性能更好,尤其是读多写少的场景。写操作会造成较大的性能开销,尤其是在事务开始时。写入流程数据首先写入 WAL 文件,然后才从 WAL 刷新到主数据库。数据在开始

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

【Python知识宝库】上下文管理器与with语句:资源管理的优雅方式

🎬 鸽芷咕:个人主页  🔥 个人专栏: 《C++干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 文章目录 前言一、什么是上下文管理器?二、上下文管理器的实现三、使用内置上下文管理器四、使用`contextlib`模块五、总结 前言 在Python编程中,资源管理是一个重要的主题,尤其是在处理文件、网络连接和数据库

dr 航迹推算 知识介绍

DR(Dead Reckoning)航迹推算是一种在航海、航空、车辆导航等领域中广泛使用的技术,用于估算物体的位置。DR航迹推算主要通过已知的初始位置和运动参数(如速度、方向)来预测物体的当前位置。以下是 DR 航迹推算的详细知识介绍: 1. 基本概念 Dead Reckoning(DR): 定义:通过利用已知的当前位置、速度、方向和时间间隔,计算物体在下一时刻的位置。应用:用于导航和定位,

【H2O2|全栈】Markdown | Md 笔记到底如何使用?【前端 · HTML前置知识】

Markdown的一些杂谈 目录 Markdown的一些杂谈 前言 准备工作 认识.Md文件 为什么使用Md? 怎么使用Md? ​编辑 怎么看别人给我的Md文件? Md文件命令 切换模式 粗体、倾斜、下划线、删除线和荧光标记 分级标题 水平线 引用 无序和有序列表 ​编辑 任务清单 插入链接和图片 内嵌代码和代码块 表格 公式 其他 源代码 预

图神经网络(2)预备知识

1. 图的基本概念         对于接触过数据结构和算法的读者来说,图并不是一个陌生的概念。一个图由一些顶点也称为节点和连接这些顶点的边组成。给定一个图G=(V,E),  其 中V={V1,V2,…,Vn}  是一个具有 n 个顶点的集合。 1.1邻接矩阵         我们用邻接矩阵A∈Rn×n表示顶点之间的连接关系。 如果顶点 vi和vj之间有连接,就表示(vi,vj)  组成了