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.mzph.cn/news/596675.shtml

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

相关文章

IO作业4.0

思维导图 创建出三个进程完成两个文件之间拷贝工作&#xff0c;子进程1拷贝前一半内容&#xff0c;子进程2拷贝后一半内容&#xff0c;父进程回收子进程的资源 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <myhead.h> int …

win2003搭建DNS服务器域名解析方法

可以搭建DNS服务器的系统有很多&#xff0c;这里以win2003举例。 要在Windows 2003上搭建DNS服务器&#xff0c;需要按照以下步骤操作&#xff1a; 一 配置DNS服务器 1、打开“控制面板”,选择“添加/删除程序”,点击“添加/删除Windows组件”。 2、在“Windows组件向导”中…

批量AI智剪方法:轻松学会视频剪辑,让你的视频更精彩

在数字媒体时代&#xff0c;视频剪辑已经成为一项重要的技能。对于许多初学者来说&#xff0c;视频剪辑可能是一项复杂且耗时的任务。那么如何解决这个问题呢&#xff1f;现在一起来看看云炫AI智剪如何批量剪辑的方法&#xff0c;轻松完成视频剪辑工作&#xff0c;让视频更加精…

通往人工智能的 Go 之路

Agency 该库旨在为那些希望通过清晰、高效且符合 Go 语言惯例的方法来探索大型语言模型&#xff08;LLMs&#xff09;和其他生成式人工智能的开发人员而设计。 特点 纯 Go 语言&#xff1a;快速、轻量级&#xff0c;静态类型&#xff0c;无需涉及 Python 或 JavaScript编写清晰…

【科研指南8】如何快速批量下载一篇论文后的所有的参考文献?附赠Endnote分组论文管理

如何快速下载一篇论文后的所有的参考文献&#xff1f; 写在最前面第一步&#xff1a;在文献检索网站导出引用文献的RIS文件第二步&#xff1a;EndNote导入RIS文件&#xff0c;然后批量下载第三步&#xff08;可选&#xff09;&#xff1a;将之前找到的论文合并到Endnote一个数据…

node常见概念

node常见概念 非阻塞&异步 node的用处 模块化 文件是互不干扰的 文件之间能相互调用 只有函数才会产生作用域。 join和resolve的区别&#xff1a; join&#xff1a;拼接 resolve&#xff1a;解析 require是同步的 把文件读成一个字符串&#xff0c;包装成一个自执行函数&am…

FLatten Transformer:聚焦式线性注意力模块

线性注意力将Softmax解耦为两个独立的函数&#xff0c;从而能够将注意力的计算顺序从(querykey)value调整为query(keyvalue)&#xff0c;使得总体的计算复杂度降低为线性。然而&#xff0c;目前的线性注意力方法要么性能明显不如Softmax注意力&#xff0c;并且可能涉及映射函数…

分享10篇优秀论文,涉及图神经网络、大模型优化、表格分析

引言 第38届AAAI人工智能年度会议将于2024年2月在加拿大温哥华举行。今天给大家分享十篇AAAI2024论文&#xff0c;主要涉及图神经网络&#xff0c;大模型幻觉、中文书法文字生成、表格数据分析、KGs错误检测、多模态Prompt、思维图生成等。 论文获取方式&#xff0c;回复&am…

高效分割视频:批量剪辑,轻松提取m3u8视频技巧

在数字媒体时代&#xff0c;视频分割是一项常见的需求。无论是为了编辑、分享还是其他要求&#xff0c;经常要将长视频分割成多个短片。传统的视频分割方法往往需要手动操作&#xff0c;既耗时又容易出错。现在来看云炫AI智剪高效分割视频的方法&#xff0c;批量剪辑并轻松提取…

LRU的设计与实现(算法村第五关黄金挑战)

146. LRU 缓存 - 力扣&#xff08;LeetCode&#xff09; 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存…

【RF 计算公式】计算自由空间损耗

1、 电信链路的基本公式 自由空间传播可使用两种不同的方法计算&#xff0c;每种方法均适用于一种特定类型的业务。 1. 1 点到区链路 如果发射机服务于若干随机分布的接收机&#xff08;广播、移动业务&#xff09;&#xff0c;则电场强的计算应在与发射机有适当距离的位置进…

手机流量卡推广分销网站php源码,多功能的号卡推广分销管理系统

源码简介 拥有多个接口&#xff0c;包括运营商接口&#xff0c;并支持无限三级代理。 最简单易用的PHP系统&#xff0c;它自带自动安装向导&#xff0c;可以让你轻松安装和部署。 该系统集成了多个第三方接口资源&#xff0c;能够满足你的不同需求。采用全系统双色主题&…

jmeter自动录制脚本功能

问题排查&#xff1a; 建议用 google浏览器&#xff1b; 重启一下jmeter&#xff1b; 过滤规则重新检查下&#xff1b; 看下代理设置是否正常&#xff1b; 注意&#xff1a;下面的的过滤设置中 用的都是正则表达式的规则。

Scikit-Learn线性回归(五)

Scikit-Learn线性回归五&#xff1a;岭回归与Lasso回归 1、误差与模型复杂度2、正则化3、Scikit-Learn岭&#xff08;Ridge&#xff09;回归4、Scikit-Learn Lasso回归 1、误差与模型复杂度 在第二篇文章 Scikit-Learn线性回归(二) 中&#xff0c;我们已经给出了过拟合与模型泛…

【解决复杂链式任务,打造全能助手】LangChain 大模型 打造 钢铁侠的全能助理 Jarvis

LangChain 大模型 结合 做 AutoGPT、ChatPDF 思维链 CoTLangChain模型IO&#xff1a;和大模型交互、提示词模版数据连接&#xff1a;从数据的接入、分割&#xff0c;到向量的构建、存储、搜索链&#xff1a;串联和组织&#xff0c;多个语言模型、组件记忆&#xff1a;灵魂伴侣&…

Java Review - Spring BeanUtils 踩坑记

文章目录 概述Spring BeanUtils基本使用Code忽略了属性类型导致拷贝失败同一字段在不同的类中定义的类型不一致同一个字段分别使用包装类和基本类型且没有传递实际值布尔类型的属性分别使用了基本类型和包装类型且属性名使用is开头 null值覆盖导致数据异常内部类数据无法成功拷…

图解算法数据结构-LeetBook-回溯01_机械累加器

请设计一个机械累加器&#xff0c;计算从 1、2… 一直累加到目标数值 target 的总和。注意这是一个只能进行加法操作的程序&#xff0c;不具备乘除、if-else、switch-case、for 循环、while 循环&#xff0c;及条件判断语句等高级功能。 注意&#xff1a;不能用等差数列求和公式…

RK3399平台入门到精通系列讲解(实验篇)IO 多路复用实验之poll实验

🚀返回总目录 文章目录 一、IO 多路复用:poll介绍二、实验源码2.1、Makefile2.2、poll 实验驱动2.3、poll 驱动测试应用程序一、IO 多路复用:poll介绍 IO 多路复用是一种同步的 IO 模型。IO 多路复用可以实现一个进程监视多个文件描述符。 一旦某个文件描述符准备就绪,就通…

osg - 光照

OSG全面支持 OpenGL 的光照特性&#xff0c;包括材质属性(material property)、光照属性(light property)和光照模型 (lighting model)。与 OpenGL 相似&#xff0c;OSG中的光源也是不可见的&#xff0c;而非渲染一个灯泡或其他自然形状。同样&#xff0c;光源会创建着色效果&a…

进程的程序替换(exec函数)【Linux】

进程的程序替换详解exec函数【Linux】 程序替换的原理exec系列函数函数理解命令理解&#xff08;助记&#xff09; 关于程序替换中环境变量的解释exec函数之间的关系exec函数的使用execlexeclpexecleexecv 程序替换的原理 进程的程序替换就是让子进程执行新程序&#xff0c; 执…