首页 > 其他分享 >全局异常处理,接口文档,JWT,base64编码解码

全局异常处理,接口文档,JWT,base64编码解码

时间:2023-05-26 19:55:39浏览次数:50  
标签:res 解码 base64 JWT 接口 token 文档 字符串

1 全局异常处理

# 对于前端来讲,后端即便报错,也要返回统一的格式,前端便于处理
{code:999,msg:'系统异常,请联系系统管理员'}


# 只要三大认证,视图类的方法出了异常,都会执行一个函数:rest_framework.views import exception_handler

### 注意:exception_handler
    # 如果异常对象是drf的APIException对象,就会返回Response
    # exception_handler只处理了drf的异常,其它的异常需要我们自己处理
    # 如果异常对象不是drf的APIException对象,就会返回None




# 补充:
	-函数和方法的区别?
    #方法只能依靠类或者对象来调用,表示针对性的操作
    #函数是独立存在的,可以直接使用
    
# 补充:
    # isinstance()   判断一个对象是不是某个类的对象  isinstance(对象,类)
    # issubclass()   判断一个类,是不是另一个类的子类

exceptions.py

def common_exception_handler(exc, context):
    # 只要走到这里,一定出异常了,我们正常的项目要记录日志(后面讲)
    # 两种可能:一个是Response对象,一个是None
    res = exception_handler(exc, context)
    if res:
        # 说明是drf的异常,它处理了
        if isinstance(res.data, dict):
            detail = res.data.get('detail')
        else:
            detail = res.data
            #2种detail都是为了获取报错信息
        return Response({'code': 998, 'msg': detail})
    else:
        # 说明是其它异常,它没有处理
        # return Response({'code': 999, 'msg': '系统异常,请联系系统管理员'})
        return Response({'code': 999, 'msg': str(exc)})
    
    
### 配置文件
REST_FRAMEWORK = {
    'EXCEPTION_HANDLER': 'app01.excepitons.common_exception_handler',
}

2 接口文档

接口文档详情

detail:https://www.cnblogs.com/liuqingzheng/articles/17413678.html
# 后端把接口写好后
	-登录接口
    -注册接口
    -查询所有图书带过滤接口
# 前端人员需要根据接口文档,进行前端开发

# 前后端需要做对接----》对接第一个东西就是这个接口文档---》前端照着接口文档开发

# 公司3个人,每个人开发了10个接口,3个人都要同时写接口文档

# 接口文档的编写形式
	-1 world,md,编写,大家都可以操作,写完放在git,公司的文档管理平台上
    -2 第三方的接口文档平台(收费)
    	https://www.showdoc.com.cn/
    -3 公司自己开发接口文档平台
    -4 公司使用开源的接口文档平台,搭建
    	-YAPI:百度开源的
        -https://zhuanlan.zhihu.com/p/366025001
        
    -5 项目自动生成接口文档
    	-coreapi
        -swagger
        
        
# 使用coreapi自动生成接口文档
	-使用步骤:
    	-1 安装:pip3 install coreapi
		-2 加一个路由
        	from rest_framework.documentation import include_docs_urls	
        	urlpatterns = [
            	path('docs/', include_docs_urls(title='站点页面标题'))
        	]
        -3 在视图类上加注释
        
        -4 配置文件中配置:
        'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.coreapi.AutoSchema',
        -5 表模型或序列化类的字段上写 help_text--->会显示在接口文档的字段介绍上
        
        -6 访问地址:
        http://127.0.0.1:8000/docs/
        

3 jwt介绍和原理

detail:
https://www.cnblogs.com/liuqingzheng/p/16154439.html

# cookie,session,token发展历史
	-会话管理
    -cookie:客户端浏览器的键值对
    -session:服务的的键值对(djangosession表,内存中,文件,缓存数据库)
    -token:服务的生成的加密字符串,如果存在客户端浏览器上,就叫cookie
    	-三部分:头,荷载,签名
        -签发:登录成功,签发
        -认证:认证类中认证
    
# jwt:Json web token (JWT),web方向的token认证
	-长得样子:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

3.1签发:根据登录请求提交来的 账号 + 密码 + 设备信息 签发 token

"""
1)用基本信息存储json字典,采用base64算法加密得到 头字符串
2)用关键信息存储json字典,采用base64算法加密得到 体字符串
3)用头、体加密字符串再加安全码信息存储json字典,采用hash md5算法加密得到 签名字符串

账号密码就能根据User表得到user对象,形成的三段字符串用 . 拼接成token返回给前台
"""

3.2校验:根据客户端带token的请求 反解出 user 对象

"""
1)将token按 . 拆分为三段字符串,第一段 头加密字符串 一般不需要做任何处理
2)第二段 体加密字符串,要反解出用户主键,通过主键从User表中就能得到登录用户,过期时间和设备信息都是安全信息,确保token没过期,且时同一设备来的
3)再用 第一段 + 第二段 + 服务器安全码 不可逆md5加密,与第三段 签名字符串 进行碰撞校验,通过后才能代表第二段校验得到的user对象就是合法的登录用户
"""

3.3drf项目jwt认证开发流程:

"""
1)用账号密码访问登录接口,登录接口逻辑中调用 签发token 算法,得到token,返回给客户端,客户端自己存到cookies中

2)校验token的算法应该写在认证类中(在认证类中调用),全局配置给认证组件,所有视图类请求,都会进行认证校验,所以请求带了token,就会反解出user对象,在视图类中用request.user就能访问登录的用户

注:登录接口需要做 认证 + 权限 两个局部禁用
"""

image

4 base64编码和解码

# base64并不是一种加密反射,只是编码解码方式
#  字符串,可以转成base64编码格式:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
# eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 解码成base64

4.1 base64的简单应用

import json
import base64

 d = {'user_id': 1, 'username': "lqz"}

 d_str = json.dumps(d)
 print(d_str)
# # 对字符串进行bashe64 编码
 res=base64.b64encode(bytes(d_str,encoding='utf-8'))
 print(res)  # eyJ1c2VyX2lkIjogMSwgInVzZXJuYW1lIjogImxxeiJ9


# 解码
 res=base64.b64decode('TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ=')
 print(res)


# 记住: base64 编码,长度一定是4的倍数。如果不够,用 = 补齐


# base64的用途
'''
1 互联网中,前后端数据交互,使用base64编码
2 jwt 字符串使用base64编码
3 互联网中一些图片,使用base64编码

'''
#将base64编码形式的二维码转化为图片形式
s = '二维码base64编码后的样子'
res = base64.b64decode(s)
with open('code.png', 'wb') as f:
    f.write(res)

标签:res,解码,base64,JWT,接口,token,文档,字符串
From: https://www.cnblogs.com/whxx/p/17435678.html

相关文章

  • SpringBoot集成JWT(极简版)
    话不多说,直接上代码接口统一前缀设置importorg.springframework.context.annotation.Configuration;importorg.springframework.web.bind.annotation.RestController;importorg.springframework.web.servlet.config.annotation.PathMatchConfigurer;importorg.springframewo......
  • Python图片与Base64相互转换
    importbase64#必须的pic=open("img.png","rb")#读取本地文件pic_base=base64.b64encode(pic.read())#本地文件转Base64数据,此时会出现编码带b'' 的情况pic_base=pic_base.decode('utf-8')#修正格式pic.close()#关闭importbase64pic=open("img.png&q......
  • Python实现JWT的生成及验证
    一、概述    在JWT安全性总结中提到了JWT的三个组成部分,包括header、claims以及signature,其中Signature是一个签名的部分,其计算方法为:HMACSHA256(base64UrlEncode(header)+"."+base64UrlEncode(payload),secret),即header的BASE64编码、点号、Clamis的BASE64编码以及将se......
  • js \x 反斜杠x 16进制 编解码
    解码functiondecode(str){ returnstr.replace(/\\x(\w{2})/g,function(_,$1){returnString.fromCharCode(parseInt($1,16))});}编码functionencode(str){returnstr.replace(/(\w)/g,function(_,$1){return"\\x"+$1.charCodeAt(0).toString(16)......
  • JWT —— token令牌
    JWT一、介绍全称:JSONWebToken,用于对应用程序上的用户进行身份标记本质上就是一个经过加密处理与校验处理的字符串,它由三部分组成:头信息(Header):记录令牌类型和签名算法,例如:{"alg":"HS256","typ":"JWT"}有效载荷(Payload):记录一些自定义能够区......
  • 调用EasyCVR平台base64编码接口转换图片,格式出现异常是什么原因?
    EasyCVR视频融合平台基于云边端智能协同架构,具有强大的设备接入、视频汇聚管理、全网分发、按需调阅、鉴权播放、智能分析等视频能力与服务。平台开放度高、兼容性强、可支持灵活拓展与第三方集成。有用户反馈,获取通道实时快照的返回结果,放到在线转换为图片的工具中出现了转换失......
  • 调用EasyCVR平台base64编码接口转换图片,格式出现异常是什么原因?
    EasyCVR视频融合平台基于云边端智能协同架构,具有强大的设备接入、视频汇聚管理、全网分发、按需调阅、鉴权播放、智能分析等视频能力与服务。平台开放度高、兼容性强、可支持灵活拓展与第三方集成。有用户反馈,获取通道实时快照的返回结果,放到在线转换为图片的工具中出现了转换失败......
  • c++ base64 编码
    #include<iostream>#include<string>#include<vector>#include<cryptopp/base64.h>#include<cryptopp/filters.h>std::stringBinaryToBase64(conststd::vector<unsignedchar>&data){std::stringencoded;C......
  • JWT加签从密钥库获取密钥对完成对JWT的签名,密钥库生成步骤
    ​ 最近再用jwt生成token,记录一下使用jdk生成秘钥库步骤,方便之后查询使用1、生成密钥库脚本命令(在本地jdk目录bin目录下,窗口路径输入cmd会车)keytool-genkey-aliasjwt-keyalgRSA-keypass123456-keystorejwt.jks-storepass123456参数说明:-alias别名-keyalg密......
  • iOS base64 编码详解
    iOSbase64编码详解iOS中将NSData转为base64编码时有NSDataBase64EncodingOptionsNSDataBase64EncodingOptions有四个选项/****************Base64Options****************/typedefNS_OPTIONS(NSUInteger,NSDataBase64EncodingOptions){//Usezerooron......