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_refreshurlpatterns = [path('login/', token_obtain_pair),  # 登录  签发tokenpath('verify/', token_verify),  # 验证token 是否有效path('refresh/', token_refresh),  # 刷新token]

settings配置

	'注册app'INSTALLED_APPS = [...'rest_framework_simplejwt',...]import datetimeSIMPLE_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_verifyurlpatterns = [path('login/', token_obtain_pair),  # 登录  签发tokenpath('verify/', token_verify),  # 验证token 是否有效path('refresh/', token_refresh),  # 刷新token]

局部配置认证及权限类

视图配置

	from rest_framework.views import APIViewfrom rest_framework_simplejwt.authentication import JWTAuthenticationfrom rest_framework.permissions import IsAuthenticatedfrom 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 TokenObtainPairSerializerclass MyTokenObtainPairSerializer(TokenObtainPairSerializer):@classmethoddef 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",}

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


三、多方式登录

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

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

相关文章

频谱论文:约束飞行轨迹下基于生成对抗网络的三维无线电地图重构

#频谱# T. Hu, Y. Huang, J. Chen, Q. Wu and Z. Gong, "3D Radio Map Reconstruction Based on Generative Adversarial Networks Under Constrained Aircraft Trajectories," in IEEE Transactions on Vehicular Technology, vol. 72, no. 6, pp. 8250-8255, June …

Vue - 多行文本“展开、收起”功能

TextClamp 使用 js 实现文本展开、收起,并非纯 CSS 实现。 Props: fontSize:Number,默认:14lines:Number,默认:1lineHeight:Number,默认:20 F…

字符编码转换

宽窄字符和字符编码的关系 多字节(窄)字符:在C/C中,char是一种数据类型,规定sizeof(char)1,即一个char占用一个字节,1Byte8bit。并没有规定一个char就要与ASCII对应,不过,通常情况下char值与AS…

2023 年博客总结

当无所事事,没有多少收获的时候,时间过得格外的快… 当充实有为,经常有收获有进步的时候,才觉得时间没有浪费… 2023年收获不多… 以前说孩子小,需要照顾所以没时间,我以为孩子大点就有时间了,…

图片处理相关网站(图片分辨率、尺寸修改、AI扩图等)

分享一些免费的可进行图片的各种处理的网站,包括图片分辨率、尺寸修改、AI扩图等,持续增加中。。。 1.photokit.com 可进行图片分辨率、尺寸、压缩等修改。 免费在线图片编辑器 - 在线抠图、改图、修图、美图 - PhotoKit.comPhotoKit是一款免费的…

【RocketMQ每日一问】RocketMQ SQL92过滤用法以及原理?

1.生产端 public class SQLProducer {public static int count 10;public static String topic "xiao-zou-topic";public static void main(String[] args) {DefaultMQProducer producer MQUtils.createLocalProducer();IntStream.range(0, count).forEach(i -&g…

自动化测试面试题及答案大全(上)

selenium中如何判断元素是否存在? 没有提供原生的方法判断元素是否存在,一般我们可以通过定位元素异常捕获的方式判断selenium中hidden或者是display = none的元素是否可以定位到? 不可以,想点击的话,可以用…

[ASIS 2019]Unicorn shop

点入题目看见四个可购买的东西,但是都购买不了,最后一个价格大的脱俗,猜测成功买到后会得到flag,但是购买时提示操作失败只允许一个字符。查看源码发现在utf-8后面特意标注提示 涉及到了字符编码和字符集的概念: UTF-…

2024 年度 AAAI Fellows 揭晓!清华大学朱军教授入选!

今日,国际人工智能领域最权威的学术组织 AAAI 揭晓 2024 年度 Fellows 评选结果,新增 12 位 Fellow。 其中,清华大学计算机系教授朱军因「在机器学习理论与实践方面做出的重大贡献」而成功入选,成为本年度入选的唯一华人学者&…

2023最大技术潮:大模型冲击下的智能汽车

作者 |德新 编辑 |王博 过去这年最大的技术潮,非大模型莫属。 2023年初,由ChatGPT掀起的浪花,迅速地演变成了席卷全球的AI科技浪潮。汽车行业在其中也不可避免。各大车企纷纷投入与大模型相关的布局。 长城官宣成立了AI Lab,到…

尝试解决 H5无法播放mp3录音问题

1.问题描述 将H5传递的录音 media_id 通过微信获取临时素材接口获取到录音文件流之后,转为mp3文件上传到服务器。但是H5却没办法播放这个mp3文件。这个文件只能在播放器上播放,比如网易云什么的。不能直接在微信,浏览器上播放 2.原因分析 通…

山西电力市场日前价格预测【2024-01-04】

日前价格预测 预测说明: 如上图所示,预测明日(2024-01-04)山西电力市场全天平均日前电价为197.93元/MWh。其中,最高日前电价为376.04元/MWh,预计出现在18:15。最低日前电价为0.00元/MWh,预计出…

Go语言基础简单了解

文章目录 前言关于Go学习流程 基础语法注释变量常量数据类型运算符fmt库 流程控制if、switch、selectfor、break、continue遍历String 函数值传递和引用传递deferinit匿名、回调、闭包函数 数组和切片Map结构体自定义数据类型接口协程和channel线程锁异常处理泛型文件读取文件写…

数据库中的几种锁

数据库锁 1.数据库锁的种类 以 mysql innoDB 为例,数据库的锁有 排他锁,共享锁,意向锁,自增锁,间隙锁,锁的范围有包括,行锁,表锁 ,区间锁。 从应用研发的视角&#xff…

C++:第十一讲DFS深搜

Everyday English Your optimal career is simply this: Share the real you with physical world through th e process of creative self-expression. 你的最佳职业很简单,就是这样:通过创造性自我表达的途径和世界分享真实的你。 前言 今天带着大家…

一元函数微分学——刷题(14

目录 1.题目:2.解题思路和步骤:3.总结:小结: 1.题目: 2.解题思路和步骤: 只要知道反函数求导等于原函数的导数的倒数,那就很好求解了,这不过要先处理好x和y的对应关系,知…

本地套接字通信

本地套接字(Unix域套接字)是用于在同一台机器上的进程之间进行通信的一种方式。它不涉及网络协议,而是直接在文件系统中创建一个套接字文件,进程可以通过该文件进行通信。 本地套接字的作用:本地的进程间通信 有关系的…

语音AI小夜灯项目

一、项目简介 使用ESP32-S3N8R8模块作为主控芯片,S3内核增加了用于加速神经网络计算和信号处理等的指令,这使得我们可以使用它来快速解析训练好的语音模型进行语音识别的功能。 二、原理解析 本项目由四个部分组成,电源部分、LED照明部分、…

uniapp二维码有效期倒计时三分钟的效果是实现

需求&#xff1a; 会员码时效只有3分钟有效期&#xff0c;需要在页面倒计时3分钟&#xff0c;没有长按保存的效果实现 效果&#xff1a; 代码&#xff1a; <templete> <view> <uni-list> <view class"custom-list-item" click"onCode(c…

java代码规范(适合写程序之前先了解有助于开发协同)

目录 一、类定义 二、方法定义 三、接口定义 四、变量定义 1、命名规范&#xff1a; 2、类型规范&#xff1a; 3、常量规范&#xff1a; 五、static关键字 1、静态变量&#xff08;类变量&#xff09;&#xff1a; 2、静态方法&#xff08;类方法&#xff09;&#x…