当前位置: 首页 > news >正文

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://以上这种情况建立在第一次拉取仓库的操作 如果你已经拉取过仓库要进行关联的话&#xff0c;就使用这种方法 #关联远程仓库 git remote add origin https:// # 拉取代码 git pull origin/…...

Mongodb命名和文档限制

选用mongodb时&#xff0c;需要了解与mongodb数据大小&#xff0c;命名上的限制。针对这些限制&#xff0c;本文针对这些限制进行翻译整理。 BSON文档 mongodb中的数据记录&#xff0c;按照文档的形式保存。文档保存在一种类似于JSON的BSON结构中。Mongodb对BSON做了一些限制…...

LangGraph 调试指南:Graph 执行轨迹怎么看,问题怎么快速定位

很多同学第一次把 LangGraph Agent 推上生产&#xff0c;跑了一周突然接到反馈&#xff1a;「你那个 AI 有时候会卡死&#xff0c;有时候答非所问」。打开控制台日志一看&#xff0c;只有一行请求进来、一行回复出去&#xff0c;中间那几十次 LLM 调用、工具调用、状态流转&…...

Nordic nRF7002 WiFi 6协处理器技术解析与应用

1. Nordic nRF7002 WiFi 6协处理器芯片深度解析作为Nordic Semiconductor首款WiFi芯片&#xff0c;nRF7002的发布标志着这家以低功耗无线技术见长的公司正式进军WiFi市场。这款双频WiFi 6协处理器芯片的定位非常明确——为现有nRF52/nRF53系列蓝牙SoC和nRF9160蜂窝IoT模组提供W…...

Vivado仿真实战:AXI4 Narrow Transfer的wstrb信号到底怎么用?

Vivado仿真实战&#xff1a;AXI4 Narrow Transfer的wstrb信号深度解析与调试技巧 在FPGA和SoC开发中&#xff0c;AXI4总线协议因其高性能和灵活性成为业界标准。但当我们实际使用Vivado进行仿真时&#xff0c;Narrow Transfer机制下的wstrb信号往往成为调试的"拦路虎"…...

STM32驱动BQ40Z50电量计:手把手教你读取电池电压、电流和剩余电量(附完整代码)

STM32驱动BQ40Z50电量计实战&#xff1a;从零搭建电池监测系统 在物联网和便携式设备爆发的时代&#xff0c;精确的电池管理已成为硬件开发的核心需求。BQ40Z50作为TI推出的高精度电量计芯片&#xff0c;凭借其专利的Impedance Track技术&#xff0c;能够准确测量锂离子电池的剩…...

蒙特卡洛算法优化N皇后问题求解

1. 问题背景与算法概述N皇后问题是一个经典的约束满足问题&#xff0c;要求在NN的棋盘上放置N个皇后&#xff0c;使得它们互不攻击。传统解法通常采用回溯算法&#xff0c;但随着棋盘尺寸增大&#xff0c;计算复杂度呈指数级增长。蒙特卡洛方法为解决这类组合优化问题提供了新思…...

ESP32-S3开发板硬件解析与LoRaWAN实战指南

1. 硬件解析&#xff1a;Heltec WiFi LoRa 32 (V4)开发板深度拆解1.1 核心硬件架构设计这款基于ESP32-S3的开发板在硬件设计上做了多项针对性优化。主控采用双核240MHz的ESP32-S3&#xff0c;搭配512KB SRAM和2MB PSRAM的内存组合&#xff0c;在低功耗场景下能保持足够的处理能…...

OpenAI发布三款音频模型,欲借差异化路线“通吃”语音AI市场!

OpenAI发布三款音频模型昨天凌晨&#xff0c;OpenAI发布了三款音频模型&#xff1a;GPT-Realtime-2、GPT-Realtime-Translate和GPT-Realtime-Whisper。OpenAI官网称&#xff0c;新模型能让开发者构建可在用户说话时“推理、翻译和转写”的实时语音产品&#xff0c;且三款模型已…...

30分钟解锁蛋白质结构预测!ColabFold如何让AI预测变得触手可及?

30分钟解锁蛋白质结构预测&#xff01;ColabFold如何让AI预测变得触手可及&#xff1f; 【免费下载链接】ColabFold Making Protein folding accessible to all! 项目地址: https://gitcode.com/gh_mirrors/co/ColabFold 蛋白质结构预测曾经是生物信息学专家的专属领域&…...

为内部知识问答系统集成Taotoken实现多模型答案融合

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 为内部知识问答系统集成Taotoken实现多模型答案融合 在构建企业级内部知识库问答系统时&#xff0c;一个核心挑战是如何确保回答的…...

SD-PPP:Photoshop AI插件终极指南 - 5分钟开启AI创作新时代

SD-PPP&#xff1a;Photoshop AI插件终极指南 - 5分钟开启AI创作新时代 【免费下载链接】sd-ppp A Photoshop AI plugin 项目地址: https://gitcode.com/gh_mirrors/sd/sd-ppp 还在为Photoshop中缺乏AI功能而烦恼吗&#xff1f;SD-PPP这款革命性的免费Photoshop AI插件将…...