【异常处理 详见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