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")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/156087.shtml

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

相关文章

【数据库设计和SQL基础语法】--数据库设计基础--数据建模与ER图

一、数据建模的基本概念 1.1. 数据模型的概念 数据模型是对现实世界中事物及其之间关系的一种抽象表示。它提供了描述数据结构、数据操作、数据约束等的方式,是数据库设计的基础。数据模型帮助我们理解数据之间的关系,提供了一种规范化的方式来组织和存…

C#编程题分享(2)

输出所有整数的和 让⽤户输⼊整数,如果⽤户输⼊的不是0,就继续输⼊,如果输⼊的是0,结束整数,并输出所有整数的和。 Console.WriteLine("请输⼊⼀个整数:"); int n; int sum 0; do {n Convert…

selenium下载安装对应的chromedriver并执行

文章目录 selenium对应版本chrome驱动下载114以及之前的chrome版本119/120/121的chrome版本 chromedriver安装执行selenium代码 selenium Selenium是广泛使用的模拟浏览器运行的库,它是一个用于Web应用程序测试的工具。 Selenium测试直接运行在浏览器中&#xff0c…

Redis 5 种基本数据类型详解

Redis 共有 5 种基本数据类型:String(字符串)、List(列表)、Set(集合)、Hash(散列)、Zset(有序集合)。 这 5 种数据类型是直接提供给用户使用的&…

VPX 插座(VITA46)介绍及应用 (简单介绍)

1. VPX 插座的介绍 VPX是VITA(VME International Trade Association, VME国际贸易协会)组织于2007年在其VME总线基础上提出的新一代高速串行总线标准。VPX总线的基本规范、机械结构和总线信号等具体内容均在ANSI/VITA46系列技术规范中定义。VPX就是基于高速串行总线的新一代总线…

PyTorch中并行训练的几种方式

❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️ 👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博…

springcloud alibaba学习视频

阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台

算数练习——模拟

卡罗尔正在学习分数除法&#xff0c;但是她在判断答案是否正确方面有困难。请你帮她找出正确的答案。 输入 一行包含三个正整数 A ,B 和 K :表示要输出的分子&#xff0c;分母和小数位数。 保证 1 < A < B <103,1 < K <103. 输出 输出一行包含小数点后 K 位的…

小诺2.0开源版工程启动

小诺是一款开源的前后端开发框架&#xff0c;同若依、SpringBladex一样可作为私活、外包脚手架。 开源地址&#xff1a;Snowy: 最新&#xff1a;&#x1f496;国内首个国密前后分离快速开发平台&#x1f496;&#xff0c;采用Vue3AntDesignVue3 ViteSpringBootMpHuToolSaToke…

操作系统(三)| 进程管理上 进程状态 同步 互斥

目录 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 严…

DispatcherSynchronizationContext and Dispatcher

https://www.cnblogs.com/liangouyang/archive/2008/11/20/1337907.html SynchronizationContext提供一个自由线程的同步上下文&#xff0c;一个常用的用法是把UI线程的同步上下文保存起来&#xff0c;传给另一个线程&#xff0c;因为UI只能再UI线程中操作&#xff0c;在另外一…

C# 电脑程序控制电路开关

最近在做系统的监控&#xff0c;想到能不能做一个酷点的功能&#xff0c;当收到异常消息时桌面上的红色小灯&#xff08;或报警灯&#xff09;会亮起来。于是在淘宝上找了一下&#xff0c;有这种小设备&#xff0c;插入USB设备&#xff0c;通过串口控制这个设备的继电器来实现&…

中级程序员——vue3+js+git面试题

&#x1f642;博主&#xff1a;小猫娃来啦 &#x1f642;文章核心&#xff1a;vue3jsgit面试题 文章目录 vue3最大缺点和优点&#xff1f;vue3组合式里面&#xff0c;如何去调用子组件里面的方法&#xff1f;watch和watcheffect有什么区别&#xff1f;计算属性和watch的区别是什…

MySQL数据库系统教程

基础篇 通用语法及分类 DDL: 数据定义语言&#xff0c;用来定义数据库对象&#xff08;数据库、表、字段&#xff09;DML: 数据操作语言&#xff0c;用来对数据库表中的数据进行增删改DQL: 数据查询语言&#xff0c;用来查询数据库中表的记录DCL: 数据控制语言&#xff0c;用…

ArcGIS教程——ArcGIS工具-按线分割面

功能说明 在ArcGIS数据处理过程中&#xff0c;有时需要沿线把面要素分割开&#xff0c;可以使用高级编辑中的分割面&#xff08;Cut Polygon&#xff09;工具。那么&#xff0c;如果要用线图层分割面图层该怎么办呢&#xff1f;地理遥感生态网平台开发了一个自定义模型工具。它…

activiti会签

12&#xff0c;Activiti会签功能 activiti6的使用&#xff0c;或签&#xff0c;会签&#xff0c;顺签 activiti学习&#xff08;十七&#xff09;——多实例任务的使用&#xff08;会签功能&#xff09;

学习笔记—吴恩达《AI for everyone》

【写在前面】 学习视频来源&#xff1a;B站“GPT中英字幕课程资源”&#xff08;见图片水印&#xff09;。 此文是自学笔记&#xff0c;主要是截图视频课件中的一些知识点&#xff0c;只做自学使用。 一. AI 介绍 二. 机器学习 Machine Learning 三. 什么是数据 What is AI 四…

你知道Linux操作系统的前世今生吗?Linux系统又该如何搭建呢?

文章目录 前言1. Linux 是什么1.1 Unix & Linux 发展历程图1.2 Linux 的发展1.3 Linux 的发行版 2. Linux 环境搭建2.1 环境搭建方式2.2 使用云服务器 3. 使用终端软件连接到 Linux3.1 什么是终端软件3.2 下载安装 XShell3.3 使用 XShell 登陆主机 总结 前言 可能很多人都…

跳台阶游戏(Python排列组合函数itertools.combinations的应用)

给定台阶总数和两种单次可跳级数&#xff0c;编写自定义函数&#xff0c;计算所有的游戏组合方案数量。 (笔记模板由python脚本于2023年11月19日 19:18:48创建&#xff0c;本篇笔记适合熟悉python自定义函数编写&#xff0c;了解排列组合知识的coder翻阅) 【学习的细节是欢悦的…

多项式求和

题目描述 给定程序中 fun 函数的功能是&#xff1a;求出以下分数序列的前 n 项之和&#xff0c;并通过函数值返回 main 函数。 输入格式 输入参数。 输出格式 计算公式返回的结果。 输入输出样例 输入1 5 输出1 8.391667 python解&#xff1a; def fun(n):a1b2s0for…