四、Drf认证组件
四、Drf认证组件
4.1 快速使用
from django.shortcuts import render,HttpResponse
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework.authentication import BaseAuthentication
from rest_framework.exceptions import AuthenticationFailed# Create your views here.
class Myauthentication(BaseAuthentication):"""用户认证:1、读取请求传递过来的token2、校验合法性3、返回值--3.1返回元组,如(11,22),认证成功,request.user=11,request.auth=22--3.2抛出异常,认证失败,返回错误信息--3.3返回None,多个认证类[类1,类2,类3,类4..。。]-->匿名用户"""def authenticate(self, request):#获取tokentoken=request.GET.get('token')if token:#如果token校验成功,则返回一个元组(用户名和token),request.user=元组[0],request.auth=元组[1]return 'sally',token#如果校验失败则抛出异常raise AuthenticationFailed({'code':2000,'error':'认证失败'})class LoginView(APIView):#该视图无需认证authentication_classes = []def get(self,request):#user和auth都为Noneprint('user', request.user)print('auth', request.auth)return Response('login')class UserView(APIView):#该视图要需认证authentication_classes = [Myauthentication,]def get(self, request):#user和auth为认证类Myauthentication返回的结果print('user',request.user)print('auth',request.auth)return Response('user')class OrderView(APIView):#该视图要需认证authentication_classes = [Myauthentication, ]def get(self, request):#user和auth为认证类Myauthentication返回的结果print(request.user)print(request.auth)return Response('order')
认证的全局配置:
上个示例中,需要在每个视图中应用认证类,比较麻烦。
可以在settings.py中做全局配置
REST_FRAMEWORK = {"UNAUTHENTICATED_USER": None,#这里指定一个或多个认证类(注意:认证类不能放在views合局视图文件中,不然会引发循环调用,这里将认证类放在了ext/auth文件中)"DEFAULT_AUTHENTICATION_CLASSES":["ext.auth.Myauthentication",]
}
这样,默认所有视图都需要认证,如果某些视图不需要认证,只需要在这些视图函数中加入‘authentication_classes = []’即可。
class LoginView(APIView):#不需要认证authentication_classes = []def get(self,request):print('user', request.user)print('auth', request.auth)return Response('login')class UserView(APIView):# 需要认证def get(self, request):print('user',request.user)print('auth',request.auth)return Response('user')class OrderView(APIView):# 需要认证def get(self, request):print(request.user)print(request.auth)return Response('order')
4.2多个认证类
settings.py
REST_FRAMEWORK = {"UNAUTHENTICATED_USER": None,"DEFAULT_AUTHENTICATION_CLASSES":["ext.auth.Myauthentication1","ext.auth.Myauthentication2","ext.auth.Noauthentication",]
}
from rest_framework.authentication import BaseAuthentication
from rest_framework.exceptions import AuthenticationFailedclass Myauthentication1(BaseAuthentication): """用户认证:1、读取请求传递过来的token2、校验合法性3、返回值--3.1返回元组,如(11,22),认证成功,request.user=11,request.auth=22--3.2抛出异常,认证失败,返回错误信息--3.3返回None,多个认证类[类1,类2,类3,类4..。。]-->匿名用户"""def authenticate(self, request):token=request.GET.get('token')if token=='123':#如果验证成功,则返回用户名和token,不再执行下一个认证类print(token)return 'sally',token#如果验证失败,则返回None,如果返回None则会执行下一个认证类return Noneclass Myauthentication2(BaseAuthentication):"""用户认证:1、读取请求传递过来的token2、校验合法性3、返回值--3.1返回元组,如(11,22),认证成功,request.user=11,request.auth=22--3.2抛出异常,认证失败,返回错误信息--3.3返回None,多个认证类[类1,类2,类3,类4..。。]-->匿名用户"""def authenticate(self, request):token = request.GET.get('token')if token == '456':#如果验证成功,则返回用户名和token,不再执行下一个认证类print(token)return 'ying',token#如果验证失败,则返回None,如果返回None则会执行下一个认证类returnclass Noauthentication(BaseAuthentication):"""用户认证:1、读取请求传递过来的token2、校验合法性3、返回值--3.1返回元组,如(11,22),认证成功,request.user=11,request.auth=22--3.2抛出异常,认证失败,返回错误信息--3.3返回None,多个认证类[类1,类2,类3,类4..。。]-->匿名用户"""def authenticate(self, request):print('认证失败')#如果以上的认证类认证全部失败,则抛出错误,认证失败。raise AuthenticationFailed({'code':2000,'error':'认证失败'})
4.3认证状态码
class Myauthentication1(BaseAuthentication):def authenticate(self, request):token=request.GET.get('token')if token=='123':print(token)return 'sally',tokenreturn Nonedef authenticate_header(self, request): #修改认证状态码return "API"
效果:

4.4子类约束
class Foo(object):def f1(self):#父类的函数中加上一个raiseraise NotImplementedError
class New(Foo):def f2(self):#如果子类定义了一个父类中不存在的方法,则会报错print('f1')obj=New()
Traceback (most recent call last):File "G:\py_project\api\app_api\tests.py", line 70, in <module>obj.f1()File "G:\py_project\api\app_api\tests.py", line 61, in f1raise NotImplementedError
NotImplementedError
4.5示例:用户登入和查看用户信息
4.5.1创建用户表
class User(models.Model):name=models.CharField(verbose_name='name',max_length=64)password=models.CharField(verbose_name='password',max_length=64)token=models.CharField(verbose_name='token',max_length=64,null=True,blank=True)
4.5.2用户登入
class LoginView(APIView):#不需要认证authentication_classes = []def post(self,request):#获取用户通过POST方式传递过来的用户名和密码name=request.data.get('name')password=request.data.get('password')print(name,password)#尝试获取用户对象user_obj=models.User.objects.filter(name=name,password=password).first()if not user_obj:#如果用户对象不存在,代表用户名密码错误return Response({'status':False,'errMsg':'用户名或密码错误'})#为用户生成一个token并保存到数据库token=str(uuid.uuid4())user_obj.token=tokenuser_obj.save()return Response({'status':True,'token':token})
使用postman发送POST请求

4.5.2查看用户信息
# 视图类
class UserView(APIView):# 需要认证def get(self, request):#返回用户名和tokenreturn Response({'user':request.user.name,'token':request.auth})
#settings.py
REST_FRAMEWORK = {"UNAUTHENTICATED_USER": None,#先认证URL参数中的token,如果认证失败则认证HTTP请求头部中的token,如果认证失败则进入未认证程序"DEFAULT_AUTHENTICATION_CLASSES":["ext.auth.Query_Params_authentication","ext.auth.Header_authentication","ext.auth.Noauthentication",]
}
#ext.auth
from rest_framework.authentication import BaseAuthentication
from rest_framework.exceptions import AuthenticationFailed
from app_api import models
class Query_Params_authentication(BaseAuthentication):"""url参数认证:1、读取请求url参数递过来的token2、校验合法性3、返回值认证通过,则返回用户对象和token,不会进入下一个认证类认证失败,返回None,进入下一个认证类"""def authenticate(self, request):#从url参数中获取tokentoken=request.query_params.get('token')if not token:# 如果token不存在,返回None,进行下个认证类return Noneuser_obj=models.User.objects.filter(token=token).first()if user_obj:#如果用户存在,不在进行下个认证类return user_obj,token #request.user=user_obj,request.auth=token#如果用户不存在,返回None,进行下个认证类return Nonedef authenticate_header(self, request):return "API"class Header_authentication(BaseAuthentication):"""头部认证:1、读取HTTP请求头部传递过来的token2、校验合法性3、返回值认证通过,则返回用户对象和token,不会进入下一个认证类认证失败,返回None,进入下一个认证类"""def authenticate(self, request):#从HTTP请求问部获取tokentoken=request.META.get('HTTP_AUTHENTICATE')if not token:# 如果token不存在,返回None,进行下个认证类return Noneuser_obj=models.User.objects.filter(token=token).first()if user_obj:#如果用户存在,不在进行下个认证类return user_obj,token #request.user=user_obj,request.auth=token#如果用户不存在,返回None,进行下个认证类return Nonedef authenticate_header(self, request):return "API"class Noauthentication(BaseAuthentication):"""未通过上面两次认证的,直接抛出错误:"""def authenticate(self, request):#如果以上的认证类认证全部失败,则抛出错误,认证失败。raise AuthenticationFailed({'code':2000,'error':'认证失败'})
使用postman进行测试
1)url参数中传递token

2)HTTP头部传递token

3)token错误

相关文章:
四、Drf认证组件
四、Drf认证组件 4.1 快速使用 from django.shortcuts import render,HttpResponse from rest_framework.response import Response from rest_framework.views import APIView from rest_framework.authentication import BaseAuthentication from rest_framework.exception…...
C++:静态成员
静态成员涉及到的关键字尾static 静态成员变量要在类外初始化 去掉static关键字类型类名::变量名 静态成员变量不属于任何对象 所有对象共享一份 静态成员可以不通过对象直接访问 类名::成员名 静态成员依旧受访问修饰符的约束 …...
28 Vue3之搭建公司级项目规范
可以看到保存的时候ref这行被提到了最前面的一行 要求内置库放在组件的前面称为auto fix,数组new arry改成了字面量,这就是我们配置的规范 js规范使用的是airbnb规范模块使用的是antfu 组合prettier&eslint airbnb规范: https://github…...
【pytorch】张量求导3
再接上文,补一下作者未补完的矩阵运算的坑。 首先贴一下原作者的图,将其转化为如下代码: import torch import torch.nn as nn import torch.optim as optim# 定义一个简单的两层神经网络 class TwoLayerNet(nn.Module):def __init__(self):super(TwoLayerNet, self).__in…...
Servlet——springMvc底层原理
我们也先了解一下什么的动态资源,什么是静态资源。 静态资源:无需程序运行就可以获取的资源(照片、html、css、js等) 动态资源:需要通关程序运行才可以获得的资源。 (其实动态、静态的资源都与Servlet有…...
Json 在线可视化工具,分享几个
文章目录 1.json.cn2.json4u.cn3.jsonvisual.com4.jsoncrack5.altearius.github.io6.json.wanvb.com 前序:本文是对多种 Json 在线可视化工具 的介绍、分享。Json官网 https://www.json.org/json-en.html 个人比较中意第四款: https://jsoncrack.com/ed…...
LLM | llama.cpp 安装使用(支持CPU、Metal及CUDA的单卡/多卡推理)
1. 详细步骤 1.1 安装 cuda 等 nvidia 依赖(非CUDA环境运行可跳过) # 以 CUDA Toolkit 12.4: Ubuntu-22.04/24.04(x86_64) 为例,注意区分 WSL 和 Ubuntu,详见 https://developer.nvidia.com/cuda-12-4-1-download-archive?targ…...
矩阵求解复数(aniwoth求解串扰)
所以这种求解串扰的格式是因为,有串扰的共轭项在方程组中 复数共轭项的作用,但是这是二次方程,...
Redis: Sentinel哨兵监控架构及环境搭建
概述 在主从模式下,我们通过从节点只读模式提高了系统的并发能力并发不断增加,只需要扩展从节点即可,只要主从服务器之间,网络连接正常主服务器就会将写入自己的数据同步更新给从服务器,从而保证主从服务器的数据相同…...
C++ 语言特性30 - 模板介绍
目录 一:C11 之前的模板特性 1. 函数模板: 2. 类模板: 3. 模板特化: 4. 模板参数: 5. 模板元编程: 二:C11的模板特性 1. 变长模板(Variadic Templates)ÿ…...
算法笔记(七)——哈希表
文章目录 两数之和判定是否互为字符重排存在重复元素存在重复元素 II字母异位词分组 哈希表:一种存储数据的容器; 可以快速查找某个元素,时间复杂度O(1); 当频繁查找某一个数时,我们可以使用哈希表 创建一个容器&#…...
【基础算法总结】链表篇
目录 一, 链表常用技巧和操作总结二,算法原理和代码实现2.两数相加24.两两交换链表中的节点143.重排链表23.合并k个升序链表25.k个一组翻转链表 三,算法总结 一, 链表常用技巧和操作总结 有关链表的算法题也是一类常见并且经典的题…...
探索路由器静态IP的获取方式
在网络配置中,路由器静态IP是一个重要的概念。对于家庭网络或办公室网络而言,正确配置静态IP地址是确保网络稳定性和管理的关键步骤之一。但是,很多人对于静态IP地址的获取方式可能感到困惑。在本文中,我们将探讨它的获取途径&…...
Vivado - JTAG to AXI Master (GPIO、IIC、HLS_IP)
目录 1. 简介 2. JTAG to AXI Master 2.1 添加 IP Core 2.2 基本TCL命令 2.2.1 复位 JTAG-to-AXI Master 2.2.2 创建并运行写入传输事务 2.2.3 创建并运行读取传输事务 2.2.4 命令列表 2.3 帮助信息 2.4 创建TCL读写程序 2.4.1 Read proc 2.4.2 Write proc 2.4.3 …...
Java中JWT(JSON Web Token)的运用
目录 1. JWT的结构2. JWT的优点3. JWT的流转过程4.具体案例一、项目结构二、依赖配置三、用户模型四、JWT工具类五、JWT请求过滤器六、安全配置七、身份验证控制器八、测试JWT JWT(JSON Web Token)是一种开放标准(RFC 7519)&#…...
CSS3练习--电商web
免责声明:本文仅做分享! 目录 小练--小兔鲜儿 目录构建 SEO 三大标签 Favicon 图标 布局网页 版心 快捷导航(shortcut) 头部(header) logo 导航 搜索 购物车 底部(footer࿰…...
Linux 默认内核版本更改
随笔记录 目录 1. 背景介绍 2. 解决方法 2.1 查看所有可用版本 2.2 安装指定版本内核 2.3 检查当前内核列表 2.4 检查当前默认内核 2.5 设置新的默认内核 2.6 确认内核是否成功加载 2.7 重启 2.8 删除其他版本内核 1. 背景介绍 linux 一般安装多个内核版本&…...
【ubuntu】修改用户名、主机名、主文件夹名、登录名、密码
目录 1.他们是什么 2.修改方法 2.1 修改用户密码 2.2 修改主机名 2.2.1 切换到root用户 2.2.2 修改名称 2.3 修改用户名 主文件夹名 登录名 2.2.1 sudoers 2.2.2 passwd 2.2.3 shadow 2.2.4 group 2.2.5 修改主文件夹名 3.重启 1.他们是什么 (1…...
深入理解JavaScript 的原型继承
JavaScript 的原型链继承机制和 Java 的类继承机制有明显的区别,虽然它们都用于实现对象之间的继承,但它们的实现方式、概念以及运行机制都不同。 1. JavaScript 的原型继承 JavaScript 是基于原型链的继承,主要依赖对象的 __proto__ 属性或…...
Error while loading conda entry point: conda-libmamba-solver
问题 解决方法 conda install --solverclassic conda-forge::conda-libmamba-solver conda-forge::libmamba conda-forge::libmambapy conda-forge::libarchive...
【AI 智能体时代的软件工程】12 信任工程:建立 AI 时代的“三维材料清单 (BOM)”
大家好,我是Tony Bai。欢迎来到微专栏 《AI 智能体时代的软件工程》的第十二讲。在前面的课程中,我们从单体智能体的“任务简报(Mission Brief)”,一路讲到了多智能体协同的“自动化流水线”,并在上一讲为你…...
5分钟掌握Google Drive受保护PDF下载:免费开源解决方案终极指南
5分钟掌握Google Drive受保护PDF下载:免费开源解决方案终极指南 【免费下载链接】Google-Drive-PDF-Downloader 项目地址: https://gitcode.com/gh_mirrors/go/Google-Drive-PDF-Downloader 还在为Google Drive中那些"仅查看"权限的PDF文件而烦恼…...
从绝望到希望:3步拯救你的重要数据
从绝望到希望:3步拯救你的重要数据 【免费下载链接】testdisk TestDisk & PhotoRec 项目地址: https://gitcode.com/gh_mirrors/te/testdisk 当硬盘突然罢工,分区神秘消失,或者重要文件被误删时,那种感觉就像精心搭建的…...
Vue+SpringBoot全栈项目搭建:手把手教你实现一个带分页和Swagger的CRUD应用
VueSpringBoot全栈开发实战:从零构建企业级CRUD应用 1. 全栈技术选型与项目初始化 在当今快速迭代的互联网开发领域,前后端分离架构已成为主流选择。Vue.js作为渐进式前端框架,以其轻量级和响应式数据绑定特性,成为构建用户界面…...
s3fs-fuse架构深度解析:如何通过FUSE实现云端存储的本地化操作
s3fs-fuse架构深度解析:如何通过FUSE实现云端存储的本地化操作 【免费下载链接】s3fs-fuse FUSE-based file system backed by Amazon S3 项目地址: https://gitcode.com/gh_mirrors/s3/s3fs-fuse 在现代云计算环境中,对象存储服务如Amazon S3已经…...
Zotero 7保姆级配置指南:从PC到安卓平板,用坚果云实现文献无缝同步
Zotero 7跨设备文献管理终极方案:Windows与安卓全链路同步实战 作为一名长期与文献打交道的科研工作者,最痛苦的莫过于在实验室电脑上精心整理的参考文献,回到家中平板上却无法查阅。这种割裂感我深有体会——直到发现Zotero 7与坚果云的组合…...
基于信息论的计算成像系统设计与优化
成像系统中的编码器(光学系统)将物体映射为无噪图像,噪声会将这些图像污染为测量值。我们的信息估计器仅利用这些含噪测量值和噪声模型,来量化测量值区分不同物体的能力。 作者:Henry Pinkard, Leyla Kabuli, Eric Mar…...
新手必看:在快马平台通过实践项目轻松理解rag工作原理
今天想和大家分享一个特别适合新手理解RAG(检索增强生成)技术的实践项目。作为一个刚接触NLP的小白,我发现通过动手实践比单纯看理论文档要高效得多。下面就用最简单的代码带大家走通RAG的核心流程,全程在InsCode(快马)平台上完成…...
GIS空间分析:从“裁剪”到“掩膜”,如何精准提取目标区域数据?
1. 为什么需要精准提取目标区域数据? 想象一下你手里有一张全国地图,但只需要研究某个城市的数据。这时候就需要像"剪刀"和"遮罩"这样的工具来帮我们精准提取目标区域。在GIS领域,这就是**裁剪(Clip)和掩膜(Mask)**两大核…...
快速部署DDColor:本地环境搭建与老照片修复完整流程
快速部署DDColor:本地环境搭建与老照片修复完整流程 1. 引言:让黑白记忆重获新生 在数字影像技术高度发达的今天,我们随手就能拍摄高清彩色照片。但那些承载着家族记忆和历史瞬间的黑白老照片,却因为技术限制而失去了色彩的温度…...
