DRF从入门到精通七(djangorestframework-simplejwt、定制返回格式、多方式登录)

文章目录

  • 一、djangorestframework-simplejwt快速使用
    • 1.基础使用步骤
    • 2.自己配置视图校验访问
      • 局部配置认证及权限类
      • 全局配置认证及权限类
    • 3.关于双token认证问题
  • 二、定制返回格式
  • 三、多方式登录

一、djangorestframework-simplejwt快速使用

JWT主要用于签发登录接口需要配合认证类 JWT目前有两种 JtwSimplejwt(jwt比较老了 simple现在比较流行)

1.基础使用步骤

  1. 安装:建议使用pycharm可以安装到指定解释器
	pip install djangorestframework-simplejwt
  1. simplejwt默认使用auth_user表签发token,所以我们直接新建项目后执行迁移命令
	-makemigrations
	-migrate
  1. 创建一个超级用户:createsuperuser
  2. 签发登录:只需要在路由中配置(simplejwt帮我们写好了登录接口以及权限类)

路由配置

	'导入模块'
	from rest_framework_simplejwt.views import token_obtain_pair, token_verify, token_refresh
	urlpatterns = [
	    path('login/', token_obtain_pair),  # 登录  签发token
	    path('verify/', token_verify),  # 验证token 是否有效
    	path('refresh/', token_refresh),  # 刷新token
	]

settings配置

	'注册app'
	INSTALLED_APPS = [
	    ...
	    'rest_framework_simplejwt',
	    ...
	]

	
	import datetime
	SIMPLE_JWT = {
	    # token有效时长
	    'ACCESS_TOKEN_LIFETIME': datetime.timedelta(minutes=30),
	    # token刷新后的有效时间
	    'REFRESH_TOKEN_LIFETIME': datetime.timedelta(days=1),
	}

此时直接访问即可,它都帮我们写好了,在请求体中携带刚刚创建的超级用户的账号密码就会返回token(因为是simplejwt它是双Token认证)

在这里插入图片描述

因为是双token认证,获取到的access才是真正使用的token,而refresh则是用于更新access。因为access过期时间很短,过期后就需要重新生成access的token保证token的安全,所以就需要使用refresh用来变更新的有效token

变更新的有效token
在这里插入图片描述


验证有效期token
在这里插入图片描述


2.自己配置视图校验访问

我们定义了一个book视图类,它只允许访问时在请求头里面携带了合法的token值才能通过认证。

路由配置

	from rest_framework_simplejwt.views import token_obtain_pair, token_verify
	urlpatterns = [
	    path('login/', token_obtain_pair),  # 登录  签发token
	    path('verify/', token_verify),  # 验证token 是否有效
	    path('refresh/', token_refresh),  # 刷新token
	]

局部配置认证及权限类

视图配置

	from rest_framework.views import APIView
	from rest_framework_simplejwt.authentication import JWTAuthentication
	from rest_framework.permissions import IsAuthenticated
	from rest_framework.response import Response
	
	'局部配置,必须配合权限类'
	class BookView(APIView):
	    '''配置的Jwt认证,但是得在headers添加,如果不添加的话,就不会生效,添加才可生效'''
	    authentication_classes = [JWTAuthentication]  # 登录认证
	    permission_classes = [IsAuthenticated]  # 配置了权限类,没登录的就没有权限访问了
	    '一旦配置了去认证类和权限类后,refresh的token就无法使用,会显示令牌类型错误,只能使用access的token'
	
	    def get(self,reqeust):
	        return Response({'测试测试'})
	
	'''
	这个时候直接访问我们的接口,就会发生错误,"detail":"身份认证信息未提供"
	因为我们访问的时候需要带上simplejwt的token
	固定格式为:Authorization:Bearer 注意这里哟一个空格,在空格后面填写签发过的token
	'''

全局配置认证及权限类

settings中配置

	# 全局配置
	REST_FRAMEWORK = {  '它自己内置的登录是哪怕配置了全局也不会进行认证,源码中进行了禁用'
	    'DEFAULT_AUTHENTICATION_CLASSES': [
	        'rest_framework_simplejwt.authentication.JWTAuthentication'
	    ],
	    'DEFAULT_PERMISSION_CLASSES': [
	        'rest_framework.permissions.IsAuthenticated',
	    ],
	}

携带登录后,服务端响应给我们的token值来访问,token值的开头必须是Bearer+空格,因为在源码内部获取校验token值前,会先通过空格进行分隔一下,第一个值是否为Bearer,如果是的话才会获取空格后面的token值来进行校验,所以我们后续会重写一些方法,不需要遵守一些不必要的规则

在这里插入图片描述

注意:只要当前的access的token没过期,而之前签发的access的token和后来刷新签发的access的token都可以使用

3.关于双token认证问题

	1)单token
		-用户登录后----->签发token---->但是有过期时间
			1.设置太短的token过期时间,如:3 minute后就需要重新登录,体验太差,一天啥事不干就重新登录
			2.设置太长的token过期时间,如:7 day,7天都不需要登录----->容易被人截获到长时间使用--->不安全
	2)双token
		-用户登录后---->签发两个token----->目前的verify检验接口,只要是它签发的token,都会认证通过
			例如:access:过期时间短 3分钟
			例如:refresh:过期时间长 7-用户正常用,都会用access,不会用refresh
		-access过会有过期了,一旦过期就用不了了---->然后可以通过refresh这个token调用刷新接口,在签发一个access的token
		-通过refresh再次签发的token这个过程,是不需要登录的,这对用户是无感知的
		-后续再使用access这个token发请求

	'认证类:就不能使用refresh的token' 

	'''
	双认证的好处就是,一旦access的token被别人截取到了,拿着模拟发请求,只能在有效时间内使用,
	因为access的token很快会过期,这样就保障安全
	'''

二、定制返回格式

继承auth_user表完成签发登录,但是它的返回格式太固定了只有Token,但是我们想自定义格式呢?

	如:
	{
		'code': 100,
	    'msg': '登录成功',
	    'username': self.user.username,
	    'token':'fdsafsfsafsadf'
    }

1.写个序列化类,重写validate ,返回什么,前端看到什么

	from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
	
	class MyTokenObtainPairSerializer(TokenObtainPairSerializer):
	    @classmethod
	    def get_token(cls, user):
	        token = super().get_token(user)  # 签发用户
	        token['name'] = user.username  # 往荷载里面添加用户名称
	        return token
		'''重写get_token方法,它返回的token中就是荷载的内容'''
	
	    def validate(self, attrs):
	        old_data = super().validate(attrs)
	        data = {'code': 100,
	                'msg': '登录成功',
	                'username': self.user.username,
	                'refresh': old_data['refresh'],
	                'access': old_data['access']
	                }
	        return data

2.在settings配置文件中配置

	SIMPLE_JWT = {
	    "TOKEN_OBTAIN_SERIALIZER": "app01.serializer.MyTokenObtainPairSerializer",
	}

效果如下
在这里插入图片描述


三、多方式登录

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

阿里云服务器云盘ESSD Entry、SSD、高效云盘性能测评

阿里云服务器系统盘或数据盘支持多种云盘类型,如高效云盘、ESSD Entry云盘、SSD云盘、ESSD云盘、ESSD PL-X云盘及ESSD AutoPL云盘等,阿里云百科aliyunbaike.com详细介绍不同云盘说明及单盘容量、最大/最小IOPS、最大/最小吞吐量、单路随机写平均时延等性…

yolo增加Shape-IoU,完美超越SIoU/EIoU/CIoU

论文地址:https://arxiv.org/pdf/2312.17663.pdf 代码地址:GitHub - malagoutou/Shape-IoU 摘要 作为检测定位分支的重要组成部分,边界框回归损失在目标检测任务中起着重要作用。现有的边界框回归方法通常考虑GT框和预测框之间的几何关系&…

C语言实例_math.h库函数功能及其用法详解

一、前言 数学在计算机编程中扮演着至关重要的角色,C语言的math.h头文件提供了一系列的函数和工具,用于数学计算和常用数学函数的实现。这些函数包括数值运算、三角函数、指数对数函数等,为开发人员提供了强大的数学处理能力。本文将对math.…

从零开始了解大数据(七):总结

系列文章目录 从零开始了解大数据(一):数据分析入门篇-CSDN博客 从零开始了解大数据(二):Hadoop篇-CSDN博客 从零开始了解大数据(三):HDFS分布式文件系统篇-CSDN博客 从零开始了解大数据(四):MapReduce篇-CSDN博客 从零开始了解大…

多模态大模型Vary:扩充视觉Vocabulary,实现更细粒度的视觉感知

前言 现代大型视觉语言模型(LVLMs)具有相同的视觉词汇- CLIP,它可以涵盖大多数常见的视觉任务。然而,对于一些需要密集和细粒度视觉感知的特殊视觉任务,例如文档级OCR或图表理解,特别是在非英语场景下,clip风格的词汇…

电子电路快速入门

参考: 电子电路设计入门篇一 https://www.bilibili.com/video/BV18C4y1p7p9Proteus与protel的区别 https://www.zhihu.com/question/385796380数字集成电路的设计流程简介 https://zhuanlan.zhihu.com/p/24476011?tt_fromweixin硬件电路设计的基本流程、作用和注意…

StratifiedGroupKFold解释和代码实现

StratifiedGroupKFold解释和代码实现 文章目录 一、StratifiedGroupKFold解释和代码实现是什么?二、 实验数据设置2.1 实验数据生成代码2.2 代码结果 三、实验代码3.1 实验代码3.2 实验结果3.3 结果解释 四、样本类别类别不平衡 一、StratifiedGroupKFold解释和代码…

简单Diff算法

简单Diff算法 渲染器的核心 Diff算法 解决的问题 比较新旧虚拟节点的子节点,实现最小化更新。 虚拟节点key属性的作用 就像虚拟节点的“身份证号”,在更新时,渲染器会通过key属性找到可复用的节点,然后尽可能地通过DOM移动操…

Hexo 部署 Github Pages, Github Actions自动部署

想整个静态的博客部署在github pages 历经两天的折磨终于是摸索成功了,官网的文档太简陋了,很多东西没说清楚。 欢迎大家访问我的博客! CanyueThis is Canyues blog.https://mobeicanyue.github.io/ 最终实现的效果,一个项目仓库…

polar CTF 简单rce

一、题目 <?php /*PolarD&N CTF*/ highlight_file(__FILE__); function no($txt){if(!preg_match("/cat|more|less|head|tac|tail|nl|od|vim|uniq|system|proc_open|shell_exec|popen| /i", $txt)){return $txt;}else{ die("whats up");}} $yyds(…

【openGauss服务器端工具的使用】

【openGauss服务器端工具的使用】 gs_checkperf openGauss 不仅提供了gs_checkperf工具来帮助用户了解openGauss的负载情况。 使用数据库安装用户登录服务器&#xff0c;执行如下命令进行查看数据库性能&#xff1a; 简要信息展示&#xff1a;[ommopengauss03 ~]$ gs_checkperf…

Ubuntu Server 22.04 连接Wifi并配置静态IP

Ubuntu Server 22.04 连接Wifi并配置静态IP 前言&#xff1a;我家最近好几台电脑&#xff0c;我都想跑着Ubuntu Server做服务器&#xff0c;但是近几年的超级本已经不自带网口了&#xff0c;所以我就考虑用Wifi来联网&#xff0c;速度也还可以&#xff0c;但是既然是跑服务&…

《算法导论》复习——CHP1、CHP2 算法基础

基本定义&#xff1a; 算法是一组有穷的规则&#xff0c;规定了解决某一特定类型问题的一系列运算。 关心算法的正确性和效率。 算法的五个重要特性&#xff1a;确定性、能行性、输入、输出、有穷性。 基础方法&#xff1a; 伪代码&#xff08;Pseudocode&#xff09;&#xff…

Springboot集成RabbitMq二

接上一篇&#xff1a;Springboot集成RabbitMq一-CSDN博客 1、搭建项目-消费者 与之前一样 2、创建配置类 package com.wym.rabbitmqconsumer.utils;import org.springframework.amqp.core.Binding; import org.springframework.amqp.core.BindingBuilder; import org.spring…

11.盛水最多的容器(双指针,C解法)

题目描述&#xff1a; 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#xff1a;…

床垫选得好孩子睡得香!康姿百德学生床垫让孩子拥有甜美梦乡

睡眠与健康密切相关,而床垫的选购则直接关系到人们睡眠质量的好坏。而孩子的床垫选择更是重中之重,青少年儿童正处于生长发育的重要时期,床垫选不好很容易导致孩子睡眠不足,影响孩子的学习,甚至会影响孩子的脊椎发育。所以,给孩子挑张好用又合适的床垫十分重要,现在让我们来看看…

SpringMVC-域对象共享数据

一、request域对象共享数据 1.1 通过ServletAPI共享数据 RequestMapping("/servletAPI")public String servletAPI(HttpServletRequest request){request.setAttribute("requestAttribute","helloworld");return "servletAPI";}<!…

(学习打卡1)重学Java设计模式之设计模式介绍

前言&#xff1a;听说有本很牛的关于Java设计模式的书——重学Java设计模式&#xff0c;然后买了(*^▽^*) 开始跟着小傅哥学Java设计模式吧&#xff0c;本文主要记录笔者的学习笔记和心得。 打卡&#xff01;打卡&#xff01; 设计模式介绍 一、设计模式是什么&#xff1f; …

学习JavaEE的日子 day08 方法的重载,递归,万年历

day08 1.方法的重载 >理解&#xff1a;方法与方法之间的关系> 条件&#xff1a;> 1.方法必须在同一个类中> 2.方法名必须一致> 3.参数列表的个数或者类型不一致> 4.与返回值无关> 好处&#xff1a;系统会根据具体实参类型自动匹配到对应的方法…

React(2): 使用 html2canvas 生成图片

使用 html2canvas 生成图片 需求 将所需的内容生成图片div 中包括 svg 等 前置准备 "react": "^18.2.0","react-dom": "^18.2.0","html2canvas": "^1.4.1",实现 <div ref{payRef}></div>const pa…