首页 > 其他分享 >异常处理、接口文档、 jwt介绍、

异常处理、接口文档、 jwt介绍、

时间:2024-04-18 20:22:11浏览次数:33  
标签:-- res base64 jwt 接口 文档 视图

【异常处理 详见excel的异常处理的源码总结】

# APIView--->dispatch--->三大认证,视图类的方法,如果出了异常,
# 会被异常捕获,捕获后统一处理
# 关键就是dispatch里面的  response = self.handle_exception(exc) 这行代码

# drf 内置了一个函数,只要上面过程出了异常,就会执行这个函数,
# 这个函数只处理的drf的异常

# 主动抛的非drf的异常,或程序出错了报的异常,都不会被处理

# 非drf的异常会又被主动抛出来,导致程序报错!!!
---------------------------------------------------

# 我们的目标,无论主动抛还是程序运行出错,都统一返回规定格式,怎么办?
   公司里一般返回   {code:999,'msg':'系统错误,请联系系统管理员'}

(异常处理函数)

# 写一个函数,内部处理异常,在配置文件中配置一下即可

# 全局异常函数处理
from datetime import datetime

from rest_framework.response import Response
from rest_framework.views import exception_handler


def common_exception_handler(exc, context):
# exc 异常错误对象
# context:上下文就是一个大字典,包含有view(哪个视图类处理错误),args,kwargs,request
# 有view:当前出错的视图类的对象,
# args和kwargs视图类方法分组出来的参数,
# request:当次请求的request对象
# 只要走到这里,就要记录日志 ,只有错了,才会执行这个函数
# 记录日志尽量详细
print('时间,登录用户id,用户ip,请求方式,请求地址,执行的视图类,错误原因')
print(
f'时间:{datetime.now()},登录用户id:{context.get("request").user.id},
  用户ip:{context.get("request").META.get("REMOTE_ADDR")},
  请求方式:{context.get("request").method},
  请求地址:{context.get("request").path},
  执行的视图类:{context.get("view")},错误原因:{exc}')

res = exception_handler(exc, context)
'''
时间,登录用户id,用户ip,请求方式,请求地址,执行的视图类,错误原因
时间:2024-04-18 15:14:14.771919,
登录用户id:None,用户ip:127.0.0.1,
请求方式:GET,请求地址:/app07/users/,
执行的视图类:<app07.views.UserView object at 0x0000014A96744E50>,
错误原因:division by zero
'''
if res:
# 有值,说明返回了Response 对象,没有值说明返回None
# 如果是Response对象说明是drf的异常,已经被处理了
# 如果是None表明没有处理,就是非drf的异常
# ValidationError和AuthenticationFailed这两个异常,一个是字典一个是列表,如果用get取值,ValidationError没办法走这个函数,要加判断
# res = Response(data={'code': 666, 'msg': res.data.get('detail', '请联系系统管理员')})
if isinstance(res.data, dict):
err = res.data.get('detail', '请联系系统管理员')
elif isinstance(res.data, list):
err = res.data[0]
else:
err = '请联系系统管理员'
res = Response(data={'code': 666, 'msg': f'[drf的异常]:{err}'})

else:
err = str(exc)
# 记录日志
res = Response(data={'code': 999, 'msg': f'[django的异常]:{err}'})

return res
--------------------------------------------------- 

# 在配置文件中配置 REST_FRAMEWORK = { 'EXCEPTION_HANDLER': 'app07.exceptions.common_exception_handler', }

 。

【接口文档的介绍】

 1 # 前后端分离
 2     -我们做后端,写接口
 3     -前端做前端,根据接口写app,pc,小程序
 4 
 5     -作为后端来讲,我们很清楚,比如登录接口  /api/v1/login/---->post----
 6 >username,password 编码方式json----》返回的格式  {code:100,msg:登录成功}
 7 
 8 
 9     -后端人员,接口写完,一定要写接口文档
10 
11 --------------------------------------------------
12 # 接口文档如何编写
13 -1 使用word,md 编写接口文档
14 
15 -2 使用第三方平台,编写我们的接口文档(非常多)---》蛮好用的
16     -https://www.showdoc.com.cn/item/index     (jinhao)
17 
18 -3 公司自己使用第三方开源的搭建的---》Yapi ---
》你如果想自己搭建,参照笔记 19 -https://zhuanlan.zhihu.com/p/366025001 20 21 -4 使用drf编写的接口,可以自动生成接口文档 22 swagger---》drf-yasg---》官方推荐使用 23 coreapi----》咱们讲 24 25 -------------------------------------------------- 26 # 使用coreapi自动生成接口文档步骤 27 - 1 安装 28 pip3.8 install coreapi -r http://pypi.douban.com/simple/ --trusted-host pypi.douban.com/simple/ 或是pip3 install coreapi
- 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

--------------------------------------------------

# 接口文档,需要有的东西
-描述
-地址
-请求方式
-请求编码格式
-请求数据详解(必填,类型)
-返回格式案例
-返回数据字段解释
-错误码
 

 (showdoc的使用步骤:支持postman)

 

 (自己写接口文档测试)

模型表中配置

 视图类中配置

 序列化器中配置

 

 

 【JWT介绍】

  Json web token (JWT) 就是web方向token的使用

1 jwt 是什么?
	-全称是:json  web  token
    -是一种前后端登陆认证的方案,区别于之前的 cookie,session
    -它有 签发阶段--》登陆成功后签发
    -它有 认证阶段--》需要登陆后才能访问的接口,通过认证后,才能继续操作
2  jwt原理--》session,cookie比较

 

 

 1 #JWT的构成 三部分,每部分用 .  分割
 2 
 3 eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
 4 
 5 - 头:header
 6          声明类型,这里是jwt
 7          声明加密的算法 通常直接使用 HMAC SHA256
 8          公司信息。。。
 9 
10 -荷载:payload
11         -存放有效信息的地方
12         -过期时间
13         -签发时间
14         -用户id
15         -用户名字。。。
16 
17 -签名:signature
18         -第一部分和第二部分通过秘钥+加密方式得到的
-签发阶段:通过头和荷载 使用 某种加密方式[HS256,md5,sha1]加密得到
            -校验阶段:拿到token,取出第一和第二部分---》通过之前同样的加密方式加密得到新签名--》用新签名和第三段(传入的老签名)比较--》
如果一样--》说明没有被篡改过--》信任--》如果不一样--》说明是被篡改了,或模拟生成的--》不能信任,返回错误

19 ------------------------------------------------------------------------------ 20 21 # jwt开发重点 22 -登录接口----》签发token 23 -认证类-----》jwt认证 24 25 ----------------------------------------------------------------------------------- 26 27 # base64编码和解码 28 29 import base64 30 import json 31 dic={'name':john,'age':"25"} 32 33 dic_str=json.dumps(dic) 34 35 #把这个字符串使用base64编码 36 res=base64.b64encode(dic_str.encode('utf-8')) 37 print(res) 38 39 40 # 解码 41 res=base64.b64decode('TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ=') 42 print(res) 43 # 注意:base64编码后,字符长度一定是4的倍数,如果不是,使用 = 补齐, = 不表示数据 44 45 ---------------------------------------------- 46 # base64 应用场景 47 48 ''' 49 1 jwt 使用了base64 50 2 网络中传输数据,也会经常使用 base64编码 51 3 网络传输中,有的图片就是使用base64编码,如12306登录时候扫码登录的二维码 52 ''' 53 54 s='图片文件二进制数据经过base64编码后的数据' 55 res=base64.b64decode(s) 56 with open('a.png','wb') as f: 57 f.write(res) 58 # wb模式写入文件,图片出解出来了

 

 3.simple-jwt使用

 1 # 项目中使用jwt认证方案
 2     -jwt:所有web框架都可能采用这种认证方案
 3         -框架
 4         -语言
 5 # python的django框架中--》使用jwt
 6     -1 自己写:登录,认证
 7     -2 使用第三方
 8         -django:simple-jwt,django-rest-framework-jwt(不用了)
 9         -flaks:flask-jwt-extended
10         
11         
12 # 使用simple-jwt 快速体验  pip install djangorestframework-simplejwt
13     - 登陆签发:默认使用auth的user表--》创建个用户--》能登录了
14         路由:   登陆接口了 
15         path('login/', token_obtain_pair), 
16         # 127.0.0.1:8080/app01/login-->post--》用户名密码就能登陆
17     - 认证
18     class UserTokenView(GenericViewSet, mixins.CreateModelMixin):
19         # 必须登陆后才能新增
20         authentication_classes = [JWTAuthentication]
21         permission_classes = [IsAuthenticated]

 

 

 

 

 

标签:--,res,base64,jwt,接口,文档,视图
From: https://www.cnblogs.com/liuliu1/p/18144323

相关文章

  • 一款还不错的文档系统
    一款还不错的文档系统功能不复杂,如果不会就去看看官方的说明吧地址:https://mindoc.com.cn/docs/mindochelp参考文档mindoc-org/mindoc:Golang实现的基于beego框架的接口在线文档管理系统地址:https://github.com/mindoc-org/mindocMinDoc文档管理系统-PoweredbyMinDoc......
  • TS — 接口
    TS接口通常指的是TypeScript接口,它是TypeScript中用来描述对象的形状的一种方式。接口可以定义对象的结构,包括属性、方法和方法的参数类型以及返回值类型。1.定义接口:interfacePerson{name:string;age:number;greet():void;}2.使用接口:functiongreet......
  • 酷狗音乐KRC歌词接口api
    解析酷狗官方KRC歌词接口APIKRC可用API接口kugou已经解决:搜索歌曲:http://ioscdn.kugou.com/api/v3/search/song?keyword=关键字&page=1&pagesize=40&showtype=10&plat=2&version=7910&tag=1&correct=1&privilege=1&sver=5搜索歌词krc:http://krcs.kugou.com/......
  • VuePress搭建文档网站
    VuePress官方文档:https://v2.vuepress.vuejs.org/zh/guide/getting-started.html以下是官方文档复制过来的步骤,加上了我的一些经验注释。1、依赖环境Node.jsv18.16.0+(我试了v14是运行不了的,必须这个版本及以上,建议安装nvm,方便切换node版本)包管理器,如pnpm、yarn、npm等(我安......
  • 网卡绑定(bond)之子接口
    服务器两张网卡需要做bond,并且bond后网卡需配置不同网段的地址,用于走不同流量,这个时候就可以采用起子接口的方式。#第一步:停掉NetworkManager服务systemctlstopNetworkManager.servicesystemctldisableNetworkManager.service#第二步:备份cp/etc/sysconfig/networ......
  • jwt json web token
    签发----登录成功后签发认证---需要登录才能访问的接口,通过认证才能继续操作2原理-----jwt和session,cookie区别2.1cookies2.2session2.2.1sessionmiddleware2.3jwttooken长什么样?三段式,用.分割每段b64编码 1st段:公司信息,加密方式就是jwt,一般固定 2nd......
  • JTCR-包和接口-07
    包包用于划分类的命名空间,使得不同包中的同名类不会冲突。Java使用文件夹存储包,文件夹名和包名一致。Java运行时系统从当前目录中、CLASSPATH变量定义的值、-classpath指定的值这三种途径寻找包。包和成员访问可访问性private无修饰符protectedpublic同一个......
  • keycloak~jwt的rs256签名的验证方式
    接口地址keycloak开放接口地址:/auth/realms/fabao/.well-known/openid-configurationrsa算法相关术语RSA算法是一种非对称加密算法,其安全性基于大整数分解的困难性。在RSA算法中,有以下几个关键参数:n(模数):n是一个大整数,通常为两个大素数p和q的乘积,即n=p*q。n用......
  • Go 单元测试之mock接口测试
    目录一、gomock工具介绍二、安装三、使用3.1指定三个参数3.2使用命令为接口生成mock实现3.3使用make命令封装处理mock四、接口单元测试步骤三、小黄书Service层单元测试四、flags五、打桩(stub)参数六、总结6.1测试用例定义6.2设计测试用例6.3执行测试用例代码6.4运行测......
  • 自动生成接口文档coreapi
    drf-yasg只能用于drf去看官方文档2coreapipipinstallcoreapi2.1配置路由fromrest_framework.documentationimportinclude_docs_urlsurlpatterns=[...path('docs/',include_docs_urls(title='站点页面标题'))]2.2drf配置#AttributeError:'......