django DRF认证组件
一、学习DRF的认证类; 设计:LoginView不登录就可以访问,UserView和OrderView需要通过认证后才能访问;
1、urls.py
urlpatterns = [path('login/', views.LoginView.as_view()),path('user/', views.UserView.as_view()),path('order/', views.OrderView.as_view()),]
2、views.py
from rest_framework.authentication import BaseAuthentication
from rest_framework.exceptions import AuthenticationFailed # 认证失败抛出异常使用class MyAuthentication(BaseAuthentication):def authenticate(self, request):'''重写这个方法,去做认证,1、读取用户请求传递的token;2、校验合法性;3、返回值:- 返回一个元组(),认证成功:必须有2个元素,request.user request.auth- 认证失败,抛出异常,返回错误信息;- 返回None,在有多个认证类的时候,会依次认证; 都没有认证成功的话,默认为匿名用户;'''token = request.query_params.get("token")if token:return ("wupeiqi","123456")else:raise AuthenticationFailed("认证失败")class LoginView(APIView):def get(self,request):return Response("LoginView")class UserView(APIView):authentication_classes = [MyAuthentication,]def get(self,request):return Response("UserView")class OrderView(APIView):authentication_classes = [MyAuthentication,]def get(self,request):return Response("OrderView")
二、简单的实例
上面快速应用,需要在每个视图中都加 authentication_classes 的设置,如果有100个都需要加,按照上面的方法就太繁琐了,所以DRF支持全局配置 authentication_classes ;
还有一个需要注意的地方:全局设置 authentication_classes 的时候,自定义认证类不能在views.py中,要单独放到一个文件中,不然会引起反复调用,报错的问题。
1、urls.py
urlpatterns = [path('login/', views.LoginView.as_view()),path('user/', views.UserView.as_view()),path('order/', views.OrderView.as_view()),]
2、views.py
class LoginView(APIView):# 排除页面设置为空就可以了;# 如果全局和局部都设置了,以局部为准;authentication_classes = []def get(self,request):return Response("LoginView")class UserView(APIView):def get(self,request):return Response("UserView")class OrderView(APIView):def get(self,request):return Response("OrderView")
4、auth.py,在项目下新建一个文件夹,名字为ext,在该文件夹下建立auth.py文件,作为自定义认证类的存放地址
from rest_framework.authentication import BaseAuthentication
from rest_framework.exceptions import AuthenticationFailed # 认证失败抛出异常使用class MyAuthentication(BaseAuthentication):def authenticate(self, request):'''重写这个方法,去做认证,1、读取用户请求传递的token;2、校验合法性;3、返回值:- 返回一个元组(),认证成功:必须有2个元素,request.user request.auth- 认证失败,抛出异常,返回错误信息;- 返回None,在有多个认证类的时候,会依次认证; 都没有认证成功的话,默认为匿名用户;'''token = request.query_params.get("token")if token:return ("wupeiqi","123456")else:raise AuthenticationFailed("认证失败")# 解决抛出异常,状态码一致的问题;def authenticate_header(self, request):return "API"
3、settings.py
REST_FRAMEWORK = {# 自定义认证组件的全局配置"DEFAULT_AUTHENTICATION_CLASSES":['ext.auth.MyAuthentication',]
}
三、多个认证类的执行流程
如果有多个认证类,执行流程是依次执行,直到最后。如果通过,后面不再执行。如果执行到最后都没有通过会返回None,匿名访问。
四、实例应用
1、urls.py
urlpatterns = [path('login/', views.LoginView.as_view()),path('user/', views.UserView.as_view()),path('order/', views.OrderView.as_view()),]
2、auth.py
from rest_framework.authentication import BaseAuthentication
from rest_framework.exceptions import AuthenticationFailed # 认证失败抛出异常使用from api import models# 在url中寻找token
class QueryParamsAuthentication(BaseAuthentication):def authenticate(self, request):'''重写这个方法,去做认证,1、读取用户请求传递的token;2、校验合法性;3、返回值:- 返回一个元组(),认证成功:必须有2个元素,request.user request.auth- 认证失败,抛出异常,返回错误信息;- 返回None,在有多个认证类的时候,会依次认证; 都没有认证成功的话,默认为匿名用户;'''token = request.query_params.get("token")# 如果没有token 返回Noneif not token:returnuser_object = models.UserInfo.objects.filter(token=token).first()if user_object:return user_object,token # 这样 request.user= 用户对象,request.auth= token ;# 没有认证成功,返回none,继续去别的认证类中认证return# 解决抛出异常,状态码一致的问题;def authenticate_header(self, request):return "API"# 在请求头中寻找token
class HeaderParamsAuthentication(BaseAuthentication):def authenticate(self, request):token = request.META.get("HTTP_AUTHORIZATION")# 如果没有token 返回Noneif not token:returnuser_object = models.UserInfo.objects.filter(token=token).first()if user_object:return user_object,token # 这样 request.user= 用户对象,request.auth= token ;# 没有认证成功,返回none,继续去别的认证类中认证return# 解决抛出异常,状态码一致的问题;def authenticate_header(self, request):return "API"# 都没找到token,抛出失败
class NoAuthentication(BaseAuthentication):def authenticate(self, request):raise AuthenticationFailed({"code":1001,"msg":"认证失败"})# 解决抛出异常,状态码一致的问题;def authenticate_header(self, request):return "API"
3、settings.py
REST_FRAMEWORK = {"UNAUTHENTICATED_USER": None,"UNAUTHENTICATED_TOKEN": None,# 自定义认证组件的全局配置"DEFAULT_AUTHENTICATION_CLASSES":['ext.auth.QueryParamsAuthentication','ext.auth.HeaderParamsAuthentication','ext.auth.NoAuthentication',]
}
4、models.py
class UserInfo(models.Model):'''用户表'''username = models.CharField(verbose_name="用户名",max_length=32)password = models.CharField(verbose_name="密码",max_length=64)# 临时测试方法,token可以存放到很多地方,例如radis jwt等token = models.CharField(verbose_name="TOKEN",max_length=64,null=True,blank=True)
5、views.py
from rest_framework.response import Response
from rest_framework.views import APIViewfrom api import models
import uuid # 用于生成tokenclass LoginView(APIView):# login页面不需要认证就可以登录,所以单独设置为空;authentication_classes = []def post(self,request):# 1、接收用户提交的用户名和密码;user = request.data.get("username")pwd = request.data.get("password")# 2、数据库校验;user_object = models.UserInfo.objects.filter(username=user,password=pwd).first()if not user_object:return Response({"status":False,"msg":"用户名或者密码错误"})# 用户名密码正确为用户生产tokentoken = str(uuid.uuid4())user_object.token = tokenuser_object.save()return Response({"status":True,"msg":"登录成功!","token":token})class UserView(APIView):def get(self,request):print(request.user,request.auth)return Response("UserView")class OrderView(APIView):def get(self,request):return Response("OrderView")
相关文章:
django DRF认证组件
一、学习DRF的认证类; 设计:LoginView不登录就可以访问,UserView和OrderView需要通过认证后才能访问; 1、urls.py urlpatterns [path(login/, views.LoginView.as_view()),path(user/, views.UserView.as_view()),path(order/,…...
操作系统(三)| 进程管理上 进程状态 同步 互斥
目录 1 进程和程序区别 2 进程状态 2.1 进程的5种基本状态 2.2 进程状态之间转换 2.3 七状态模型 3 进程描述 3.1 进程控制块 PCB 3.2 进程块组织方式 4 进程控制 5 进程同步 互斥 5.1 区分进程互斥和同步 5.2 核心方案 5.3 其他方案 方案1 设置锁变量 方案2 严…...
Postman插件如何安装(一)
我们chrome插件网热门推荐的软件之一就是postman。但是postman的适应平台分为:postman chrome应用程序,postman应用程序,postman插件。谷歌应用商店从2018年3月开始停止chrome应用程序的更新。除非继续使用老版本的postman chrome应用程序&am…...
在回调之间共享数据
可以在 App 中为 UI 组件编写回调函数,以指定用户与其交互时的行为方式。 在具有多个相互依赖的 UI 组件的 App 中,回调函数通常必须访问主 App 函数中定义的数据,或与其他回调函数共享数据。例如,如果创建一个具有列表框的 App&a…...
我在CSDN开组会1-蒙特卡洛模拟在矿床学的应用展望
各位老师、同学们,大家好。今天组会的内容是蒙特卡洛模拟在矿床学的应用展望。 为什么要讲蒙特卡洛模拟呢,因为我发现在地质学方面已经有不少应用,但是蒙特卡洛模拟延伸的知识太晦涩了,劝退了很多探究者们。因此,计划…...
Jmeter 性能测试基础!
压力测试 压力测试分两种场景:一种是单场景,压一个接口的;第二种是混合场景,多个有关联的接口。压测时间,一般场景都运行10-15分钟。如果是疲劳测试,可以压一天或一周,根据实际情况来定。 压测任…...
【赠书第6期】MATLAB科学计算从入门到精通
文章目录 前言 1 安装与配置 2 变量定义 3 数据处理 4 绘图 5 算法设计 6 程序调试 7 推荐图书 8 粉丝福利 前言 MATLAB 是一种高级的科学计算和数据可视化平台。它由 MathWorks 公司开发,是科学研究、数据分析和工程实践中非常常用的一种软件工具。本文将…...
Java语言基础第五天
精华笔记: 循环结构: for结构:应用率最高,与次数相关的循环 三种结构如何选择: 先看循环是否与次数相关: 若相关-----------------------------直接上for 若无关,再看要素1与要素3的代码是否相…...
linux网络——HTTPS加密原理
目录 一.HTTPS概述 二.概念准备 三.为什么要加密 四.常⻅的加密⽅式 1.对称加密 2.⾮对称加密 五.数据摘要,数字签名 六.HTTPS的加密过程探究 1.方案一——只使用对称加密 2.方案二——只使⽤⾮对称加密 3.方案三——双⽅都使⽤⾮对称加密 4.方案四——⾮…...
shell 各种括号作用总结
技巧小结: 字符串比较用双中括号[[ ]] 算数比较用单中括号[ ]——左右留空格 算数运算用双小括号(( )) shell命令及输出用小括号( )——左右不留空格 快速替换用花括号{ }——左右留空格 反单引号起着命令替换的作用 一、单括号(): 1、另开命令组——小…...
2023-11-18 mysql-sysbench压测TPS/QPS-记录
摘要: 2023-11-18 mysql-sysbench压测TPS/QPS sysbench压测TPS/QPS 使用 sysbench 压测 TPS/QPS 的基础测试数据是 6 张表,每张表写入 10 万行数据,然后在此基础测试数据上分别进行 300 秒的混合写、更新、删除压测。 sysbench --mysql-host=192.168.41.xxx --mysql-port=3…...
树与二叉树堆:树
目录 树: 树的概念: 树的相关概念: 1、结点的度: 2、叶节点:度为0的节点 3、非终端节点或分支节点: 4、父节点和子节点: 5、兄弟节点: 6、树的度: 7、树的层次或…...
【监控系统】日志可视化监控体系ELK搭建
1.ELK架构是什么 ELK是ElasticsearchLogstashKibana的简称。 Elasticsearch是一个开源的分布式搜索和分析引擎,可以用于全文检索、结构化检索和分析,它构建在Lucene搜索引擎库之上,是当前使用较为广泛的开源搜索引擎之一。 Logstash是一个…...
【Linux】22、CPU 评价指标、性能工具、定位瓶颈、优化方法论:应用程序和系统
文章目录 一、评价 CPU 的指标1.1 CPU 使用率1.2 平均负载(Load Average)1.3 上下文切换1.4 CPU 缓存命中率 二、性能工具2.1 维度:从 CPU 性能指标出发,即当你查看某性能指标时,要清除知道哪些工具可以做到2.2 维度&a…...
Foodpanda API连接的艺术:无代码开发如何集成营销系统和广告推广工具
连接Foodpanda和电商平台的无代码开发 Foodpanda不仅是一家提供快速外卖服务的国际品牌,而且其创新的技术解决方案还能帮助电商企业优化系统运营。通过无代码开发的方法,即使没有专业的API开发知识,商家也能实现高效的电商系统和客服系统连接…...
SpringBoot——数据访问
优质博文:IT-BLOG-CN 对于数据访问层,无论是SQL还是NoSQL,SpringBoot默认采用整合Spring Data的方式进行统一处理,添加大量自动配置,屏蔽了很多设置。引入各种xxxTemplate,xxxRepository来简化我们对数据访…...
【C++深度剖析学习总结】28 函数对象分析
1.客户需求 编写一个函数,满足三个需求 函数可以获得斐波那契数列每项的值 每调用一次返回一个值 函数可根据需要重复使用 for(int i =0; i<10; i++) { cout << fib() << endl; } 第一个解决方案 #include<iostream> #include<string> using na…...
持续集成部署-k8s-配置与存储-配置管理:SubPath
持续集成部署-k8s-配置与存储-配置管理:SubPath 1. 简介2. 测试 挂载文件目录3. subPath 解决挂载目录时覆盖原容器内文件夹1. 简介 在Kubernetes (K8s) 中,SubPath是用于指定容器内部目录挂载的一个属性。它可以在Pod中指定某个Volume挂载到容器内部的特定目录下,以便容器…...
git容易出问题的命令
#首先进行git init初始化本地仓库 git init #再进行拉取远程仓库代码 git clone http://以上这种情况建立在第一次拉取仓库的操作 如果你已经拉取过仓库要进行关联的话,就使用这种方法 #关联远程仓库 git remote add origin https:// # 拉取代码 git pull origin/…...
Mongodb命名和文档限制
选用mongodb时,需要了解与mongodb数据大小,命名上的限制。针对这些限制,本文针对这些限制进行翻译整理。 BSON文档 mongodb中的数据记录,按照文档的形式保存。文档保存在一种类似于JSON的BSON结构中。Mongodb对BSON做了一些限制…...
8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...
怎么让Comfyui导出的图像不包含工作流信息,
为了数据安全,让Comfyui导出的图像不包含工作流信息,导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo(推荐) 在 save_images 方法中,删除或注释掉所有与 metadata …...
MySQL 主从同步异常处理
阅读原文:https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主,遇到的这个错误: Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一,通常表示ÿ…...
【LeetCode】算法详解#6 ---除自身以外数组的乘积
1.题目介绍 给定一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O…...
LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用
中达瑞和自2005年成立以来,一直在光谱成像领域深度钻研和发展,始终致力于研发高性能、高可靠性的光谱成像相机,为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...
JDK 17 序列化是怎么回事
如何序列化?其实很简单,就是根据每个类型,用工厂类调用。逐个完成。 没什么漂亮的代码,只有有效、稳定的代码。 代码中调用toJson toJson 代码 mapper.writeValueAsString ObjectMapper DefaultSerializerProvider 一堆实…...
用鸿蒙HarmonyOS5实现国际象棋小游戏的过程
下面是一个基于鸿蒙OS (HarmonyOS) 的国际象棋小游戏的完整实现代码,使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├── …...
