接口文档 token原理 jwt介绍和原理 drf-jwt快速使用
昨日回顾
# 1 认证类的执行流程---》源码分析
-请求进来---》路由匹配成功----》执行path('test/', view.BookView.as_view()),--->继承了APIView----》APIView的as_view()内部的闭包函数view----》这个view中执行了self.dispatch--->APIView的dispatch----》
def dispatch(self, request, *args, **kwargs):
# 包装了新的request
request = self.initialize_request(request, *args, **kwargs)
。。。
# 执行3大认证
self.initial(request, *args, **kwargs)
# 下面执行视图类的方法
def initial(self, request, *args, **kwargs):
# 认证
self.perform_authentication(request)
self.check_permissions(request)
self.check_throttles(request)
def perform_authentication(self, request):
request.user
####### Request 新的Request内部找 user
@property
def user(self):
if not hasattr(self, '_user'):
with wrap_attributeerrors(): # 上下文管理器----》面试
self._authenticate()
return self._user
### 核心代码
def _authenticate(self):
# self.authenticators---》列表[认证类对象1,认证类对象2]
# authenticator 是认证类的对象
for authenticator in self.authenticators:
try:
#认证类对象.authenticate self 是新的request对象
user_auth_tuple = authenticator.authenticate(self)
except exceptions.APIException:
self._not_authenticated()
raise
if user_auth_tuple is not None:
self._authenticator = authenticator
#self 是新的request
# request.user 就是当前登录用户
# request.auth 一般把token给它
self.user, self.auth = user_auth_tuple
return
self._not_authenticated()
# self.authenticators:是什么时候传入的?执行__init__ 就是在Request初始化的时候传入的
-在APIView的dispatch的self.initialize_request(request, *args, **kwargs)初始化的,
return Request(
request,
parsers=self.get_parsers(),
#在这里传入的
authenticators=self.get_authenticators(),
negotiator=self.get_content_negotiator(),
parser_context=parser_context
)
-APIView的--get_authenticators()----》return [auth() for auth in self.authentication_classes]
-self.authentication_classes:视图类中配置的一个个的认证类的列表,如果没配,配置文件中,内置配置文件中
# 2 权限类的执行流程
# 3 频率类的执行流程
# 4 自己定义了一个频率类,基于BaseThrottle,重写allow_request
# 5 SimpleRateThrottle
-继承它,写代码少
-只需要重写get_cache_key和scope类属性,配置文件配置
-源码:allow_request----》就是咱们上面写的,可扩展性高,好多东西从配置文件取的
# 6 全局异常处理
-源码中,在3大认证,视图类的方法中如果出错,就会执行:self.handle_exception(exc)
def handle_exception(self, exc):
# 去配置文件中找到:EXCEPTION_HANDLER对应的函数,exception_handler
exception_handler = self.get_exception_handler()
# exception_handler(exc,context)
response = exception_handler(exc, context)
return response
-自己再配置文件中配置,以后出了异常,走咱们自己的,有两个参数exc, context
-exc错误对象
-context:上下文,包含 view,request。。。。
当请求进来 ---> 路由匹配成功 ---> 执行可调用对象
执行path('test/',view.BookView.as_view())
---> APIView的dispatch ---去掉csrf--> 原生django的dispatch

执行可调用对象:
path('test/',可调用对象)
可以放置如下可调用对象:
- 可以放函数的内存地址 ---> 执行APIView的view闭包函数
- 可以放一个对象 ---> 执行魔法方法
__call__
认证

request.user:

request.user()可以加括号调用吗?
实现with上下文管理器 重写两个魔法方法。
核心代码:

self.authenticators:

request对象何时执行__init__?
request对象什么时候初始化的。

initalize_request,在这里传入列表,列表里都是认证类的对象:

使用这个函数获取认证类的对象:

关于认证类的获取:

重新回到_authenticate:
调用认证类的authenticate方法。

后续:

通过认证
认证函数的返回值:
权限

权限第一个没过,后面就不会再走了,因为会抛出一个异常。
频率

- 自定义频率类:继承
Basethrottle, 重写allow_request.
认证权限限流 中间件 9.06 28 限流逻辑 - SimpleRateThrottle 不太懂
重写get_cache_key和scope

会对django进行一次封装。
基础平台部 ---> 封装框架的 ---> 浪潮楼上平台
我们封装了django框架 只有我们公司自己用
掉包侠只会掉包
业务能力 ---> 不想写业务 ---> 写平台不 ---> 一个for循环套十几个SQL
全局异常处理


找到配置文件中对应的函数。
自定义异常处理:

APIview的exception_handler只处理drf的异常。
你给前端详细的报错信息,前端会直接在app上面打印。
服务异常请稍后再试 ---> 接口崩了。
context如何包装?


auth ---》 model --》 表定义。
云闪付app:银联出的云闪付,招商银行付款不成功,10038错误
云闪付客服 ---> 招商银行接口的问题 ---> 招商银行的问题 ---> 云闪付的问题
就是调用付款接口招商银行的问题。
接口文档
# 前后端分离
-我们做后端,写接口
-前端做前端,根据接口写app,pc,小程序
-作为后端来讲,我们很清楚,比如登录接口 /api/v1/login/---->post---->username,password 编码方式json----》返回的格式 {code:100,msg:登录成功}
-后端人员,接口写完,一定要写接口文档
# 接口文档如何编写
-1 使用word,md 编写接口文档
-2 使用第三方平台,编写我们的接口文档(非常多)---》收费
-https://www.showdoc.com.cn/item/index
-3 公司自己使用第三方开源的搭建的---》Yapi ---》你如果想自己搭建
-https://zhuanlan.zhihu.com/p/366025001
-4 使用drf编写的接口,可以自动生成接口文档
-swagger---》drf-yasg---》官方推荐使用
-coreapi----》咱们讲
# 使用coreapi自动生成接口文档步骤
- 1 安装
- 2 配置路由
from rest_framework.documentation import include_docs_urls
path('docs/', include_docs_urls(title='xx项目接口文档')),
-3 在视图类,方法上,写注释即可
-在类上加注释
-在类的方法上加注释
-在序列化类或表模型的字段上加 help_text,required。。。。
-4 配置文件配置
REST_FRAMEWORK = {
'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.coreapi.AutoSchema',
}
-5 访问地址:http://127.0.0.1:8000/docs
# 接口文档,需要有的东西
-描述
-地址
-请求方式
-请求编码格式
-请求数据详解(必填,类型)
-返回格式案例
-返回数据字段解释
-错误码
接口文档编写
-1 使用word,md 编写接口文档 (很多公司在用)
-2 使用第三方软件平台,编写我们的接口文档(非常多)
一般来说收费,不安全
https://showDoc.com.cn
2个人协作免费 --> 5个人收费
-3 公司使用第三方开源的搭建的
YApi ---> 大公司有专业的人搭建
-4 drf自动生成接口文档
示例:


重点:


重点是请求的URL的地址 ---> 千万不能写错
编码格式:

接口文档,需要有的东西:
描述、地址、请求方式、编码格式、请求数据详解、返回数据详解
YApi:

有时间搭建一下:
B站自己开发的接口文档平台。
编写接口文档,是后端的工作之一。
drf自动生成接口文档


官方推荐使用drf-yssg ---> 不好用
-swagger --drf-> drf-yasg

coreapi自动生成文档:

在类方法上写注释:

在配置文件去配置:

查看效果:
会自动生成接口。
如何加注释?

如果类中没有方法,直接加注释:

注释会显示在前端:
序列化类中写:

表模型中写:

还可以直接操作:

python/Django-rest-framework框架/8-drf-自动生成接口文档 | Justin-刘清政的博客 (liuqingzheng.top)
期终架构 ---> 写一个面试可以聊的项目
现实生活中真正存在的项目 期终架构设计!
生鲜app、小程序。符合真实情况。 美食点单小程序。南京路美食城。经历过医院挂号的一套流程,才能写出医院的app。
预约洗车app。二维火手机点单后台。
扫码报备,疫情报备系统。
小程序 ---> 实在想不到 ---> 写商城
cookies-session-token发展史
不需要做会话的保持。不能记住刚刚是谁发送的请求。
请求来了,就发送给静态页面。无状态 无连接 也是http请求的问题
需要做会话的标识,区分请求是谁 ---> cookies的产生
cookies存在浏览器不安全 ---> cookies + session
cookies和session几乎同时出现。在服务端存放的键值对叫session,在浏览器存放的键值对叫cookies。
服务器需要保存所有人的sessionid,服务器吃不消。
服务器集群的问题11.03 5
集群增加并发量。


解决安全性问题,让客户端来保存。

头 (公司信息) 荷载 (用户信息)--生成--> 签名 ---> token的签发阶段

只要包装的用户Id是安全的就可以了。
我不知道加密方式 和 密钥的情况下 是无法生成签名的。
存在直接获取整个token,来发送请求获取服务器的信息的方法。
----> 爬虫
jwt介绍和原理
# cookie session token 发展史
# Json web token (JWT) 就是web方向token的使用
#JWT的构成 三部分,每部分用 . 分割
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
- 头:header
声明类型,这里是jwt
声明加密的算法 通常直接使用 HMAC SHA256
公司信息。。。
-荷载:payload
-存放有效信息的地方
-过期时间
-签发时间
-用户id
-用户名字。。。
-签名:signature
-第一部分和第二部分通过秘钥+加密方式得到的
# jwt开发重点
-登录接口---->签发token
-认证类-----》jwt认证
# base64编码和解码
import base64
import json
# dic={'user_id':1,'username':"lqz"}
#
# dic_str=json.dumps(dic)
#
# #把这个字符串使用base64编码
# res=base64.b64encode(dic_str.encode('utf-8'))
# print(res) #
# 注意:base64编码后,字符长度一定是4的倍数,如果不是,使用 = 补齐, = 不表示数据
# 解码
res=base64.b64decode('TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ=')
print(res)
# base64 应用场景
'''
1 jwt 使用了base64
2 网络中传输数据,也会经常使用 base64编码
3 网络传输中,有的图片使用base64编码
'''
s=''
res=base64.b64decode(s)
with open('a.png','wb') as f:
f.write(res)
token签发和认证流程:

头和荷载 ---> 猜加密方式 ---> 还有密钥
社会工程学 ---> 通过其他网站的密码,猜到这个网站的密码
jwt的构成

base64的编码和解码




头。
体包含过期时间:

base64编码字符长度一定是4的倍数,否则会报错:不足需要用=补齐。

=这个字符不存储数据。

网络传输中使用base64
前端需要用base64转换一下。明文的密码只能在自己电脑上被抓到。
图片base64加密:

base64解码,保存到文件:

传输jwt也会进行base64编码。

drf-jwt快速使用
#django+drf 平台开发jwt这套,有两个模块
-djangorestframework-jwt ---》一直可以用
-djangorestframework-simplejwt---》公司用的多---》希望你们试一下
-自己封装jwt签发和认证
# 使用步骤
- 1 安装
- 2 快速签发token---》登录接口,路由中配置
path('login/', obtain_jwt_token),
-3 postman,向http://127.0.0.1:8000/login/发送post请求,携带username和password
drf-jwt年久失修。
自己封装jwt签发和认证。
公司用的djangorestframework-simplejwt
老项目 --->不好用 ---> 我重写了
安装drf-jwt
基于auth的user表签发。






密钥使用的是配置文件中的密钥:

定制返回格式
# 以后,如果是基于auth的User表签发token,就可以不自己写了,但是登录接口返回的格式,只有token,不符合公司规范
# 使用步骤
1 写个函数:jwt_response_payload_handler
def jwt_response_payload_handler(token, user=None, request=None):
return {
'code': 100,
'msg': '登录成功',
'token': token,
'username': user.username
# 'icon':user.icon
}
2 配置一下 ,项目配置文件
JWT_AUTH = {
'JWT_RESPONSE_PAYLOAD_HANDLER': 'app01.utils.jwt_response_payload_handler',
}
3 使用postman测试,就能看到返回的格式了
基于auth的user表签发token,就可以不用自己写了。





jwt的认证类
# 以后接口要登录后才能访问的使用
1 在视图类上加一个认证类,一个权限类class BookView(ViewSetMixin, RetrieveAPIView):
authentication_classes = [JSONWebTokenAuthentication]
permission_classes = [IsAuthenticated] # 登录用户有权限,不登录用户没权限
2 postman测试
-请求头中key值叫Authorization
-请求头的value值是: jwt 有效的token值
jwt提供的登录认证:

判断带没带token 没带不管 带了必须认证
没带身份证开台机子 带了必须满18

控制登录用户的权限。
token带在请求头中:


第一个是jwt提供的认证类 第二个是drf提供的权限类
既然使用jwt认证 那么必须按照别人的要求写。


1 自动生成接口文档试一下
2 使用drf-jwt快速签发和认证token,定制返回格式 ok
3 使用simplejwt,签发token
4 drf-jwt 登录接口怎么写的
-它把逻辑写在了序列化类中----》全局钩子中
接口文档 token原理 jwt介绍和原理 drf-jwt快速使用的更多相关文章
- 全网最详细中英文ChatGPT接口文档(二)30分钟开始使用ChatGPT——快速入门
目录 Quickstart 快速启动 Introduction 导言 1 Start with an instruction 从说明开始 2 Add some examples 添加一些示例 3 Ad ...
- Django(74)drf-spectacular自动生成接口文档
介绍 drf-spectacular是为Django REST Framework生成合理灵活的OpenAPI 3.0模式.它可以自动帮我们提取接口中的信息,从而形成接口文档,而且内容十分详细,再也不 ...
- Django框架之drf:9、接口文档,coreapi的使用,JWT原理、介绍、快速使用、定制、认证
目录 Django框架之drf 一.接口文档 二.CoreAPI文档生成器 1.使用方法 三.JWT 1.JWT原理及介绍 2.JWP快速使用 3.定制返回格式 4.JTW的认证类 Django框架之 ...
- rbac介绍、自动生成接口文档、jwt介绍与快速签发认证、jwt定制返回格式
今日内容概要 RBAC 自动生成接口文档 jwt介绍与快速使用 jwt定制返回格式 jwt源码分析 内容详细 1.RBAC(重要) # RBAC 是基于角色的访问控制(Role-Based Acces ...
- drf频率源码、自动生成接口文档、JWT
目录 一.drf频率源码分析 二.自动生成接口文档 1 安装依赖 2 设置接口文档访问路径 3 文档描述说明的定义位置 4 访问接口文档网页 三.JWT 1 JWT基本原理 1.1 header 1. ...
- postman项目接口文档和登录步骤原理
培训内容 实训项目:非常果岭-发现模块接口测试,单接口.流程脚本编写: 使用工具:postman 培训方式 1)postman使用说明 2)项目接口文档和登录步骤原理 一.首先了解postman使 ...
- SpringBoot整合knife4j框架(可生成离线接口文档),并设置接口请求头token默认值
功能和swagger类似 官网地址:https://doc.xiaominfo.com/knife4j/ 这个框架可以设置返回字段的描述 引入依赖 <dependency> <gro ...
- springboot+swagger接口文档企业实践(上)
目录 1.引言 2.swagger简介 2.1 swagger 介绍 2.2 springfox.swagger与springboot 3. 使用springboot+swagger构建接口文档 3. ...
- 电商管理后台 API 接口文档
1. 电商管理后台 API 接口文档 1.1. API V1 接口说明 接口基准地址:http://127.0.0.1:8888/api/private/v1/ 服务端已开启 CORS 跨域支持 AP ...
- .net core的Swagger接口文档使用教程(二):NSwag
上一篇介绍了Swashbuckle ,地址:.net core的Swagger接口文档使用教程(一):Swashbuckle 讲的东西还挺多,怎奈微软还推荐了一个NSwag,那就继续写吧! 但是和Sw ...
随机推荐
- STL multiset容器
multiset容器的概念和性质 set在英文中的意义是:集合.而multi−前缀则表示:多重的.所以multiset容器就叫做:有序多重集合. multiset的很多性质和使用方式和set容器差不了 ...
- Silverlight工作流控件功能缺失,Windows Server操作系统 IIS添加WCF功能
注: Silverlight工作流控件,如果在网页中打不开,则要判断是否缺少Silverlight工作流控件的插件程序,如果不是则可以进行一下步骤检查,如果是以下原因则是:由于IIS版本问题,安装后可 ...
- 【译】使用 GitHub Copilot 编写 Git 提交
在花费数小时修复 bug 或更新特性之后,我们开发人员最不愿意做的事情往往是仔细说明 Git 提交的内容.最新的 Visual Studio 预览版可以帮到您.使用新的生成 Git 提交消息特性来帮助 ...
- [CF1748E] Yet Another Array Counting Problem
题目描述 The position of the leftmost maximum on the segment $ [l; r] $ of array $ x = [x_1, x_2, \ldots ...
- linux没有ifconfig命令
直接控制台安装(输入下面对应的tools命令就好了) ifconfig yum install -y net-tools.x86_64 vim yum -y install vim*
- LeetCode331:验证二叉树的前序序列化(递归)
解题思路:把所有元素存成数组,设置一个全局下标next,表示当前节点如果要继续遍历应当从数组的哪个位置开始,然后从下标 0 开始DFS.如果DFS返回真并且next下标等于数组的长度,说明元素已经全部 ...
- Oracle密码文件、警告日志文件、跟踪文件
密码文件 oracle用于验证sysdba权限的二进制文件. 警告日志文件 警告日志文件是用来记录oracle数据库系统在运行期间的各种信息: oracle实例打开和关闭.建立表空间.增加数据文件等记 ...
- 华企盾DSC忘记了数据库解锁密码
解决方法:登录数据库控制台,找到DSE所使用数据库默认名字"DSEDB",打开表"FileEncryptKey_TABLE",如下图所示: 第一行,自动生成 ...
- 腾讯云服务器安装MySQL5.7基于xshell
腾讯云服务器安装MySQL5.7基于xshell 下载MySQL57安装包 wget https://dev.mysql.com/get/mysql57-community-release-el7-1 ...
- Python——第二章:字典(dictionary)以及 添、删、改、查
首先, 字典是以键值对的形式进行存储数据的,必须有键[key],有值[value] 字典的表示方式: {key:value, key2:value, key3:value} 举例: dic = {&q ...