1 前后端分离的rbac项目演示
# 后台:https://gitee.com/liuqingzheng/rbac_manager
# 前端:https://gitee.com/liuqingzheng/vue_admin
2 全局异常处理封装
# 前端 要接受的格式,要统一,无论后端是否出错
# 三大认证,视图类的方法中只要出了异常,就会执行一个函数,但是这个函数只能处理drf的异常---》我们需要自己写一个函数,既能处理drf异常,又能处理django异常,这样统一返回格式,前端看到格式都统一了
# 使用步骤
-第一步:在utils中新建 common_exceptions.py
-第二步:写个函数
-看项目代码
-第三步:配置配置文件,以后只要出了异常,都会走咱们的函数
REST_FRAMEWORK = {
'EXCEPTION_HANDLER': 'utils.common_exceptions.exception_handler',
}
-第四步:勇敢大胆写代码,即便报错,程序不会蹦,并且会记录日志,并且处理成统一格式
from rest_framework.views import exception_handler as drf_exception_handler
from rest_framework.response import Response
from utils.common_logger import logger
# 只要走到这个函数中,一定是出了异常,所以要记录日志
def exception_handler(exc,context):
# 1 记录日志:哪个ip地址,用户id是多少,访问哪个路径,执行哪个视图函数,出了什么错
request = context.get('request')
view = context.get('view')
ip = request.META.get('REMOTE_ADDR')
user_id = request.user.pk
path = reqeust.get_full_path()
response = drf_exception_handler(exc, context)
if response:
logger.warning('drf出了异常,异常是:%s' % str(exc))
# drf的异常已经处理了---》直接取detail会有点小小的问题,碰到在解决
res = Response({'code': 999, 'msg': response.data.get('detail', '服务器异常,请联系系统管理员')})
else:
# django的异常,咱们要处理
logger.error('用户【%s】,ip地址为【%s】,访问地址为【%s】,执行视图函数为【%s】,出错是【%s】' % (user_id, ip, path, str(view), str(exc)))
res = Response({'code': 888, 'msg': '服务器异常,请联系系统管理员'})
return res
3 封装Response
# 本身drf有Response,但咱们公司规定,前端收到的格式都是固定的
-{code:100, msg:提示, data:{}/[]}
-{code:100, msg:提示, token:asdfasd,user:lqz}
# 对Response进行封装,封装后,code,msg可以不传,不传就用默认的
# 使用步骤
第一步:在utils下新建common_response.py
第二步:封装APIRespon
第三步:导入使用,视图函数的方法,返回时,都使用咱们自己的
class APIResponse(Response):
def __init__(self, code=100, msg='success', status=None, headers=None, **kwargs):
data = {'code': code, 'msg': msg}
if kwargs: # 有值,说明传了 除了code msg status headers以外的,咱们都要返回给前端放在这个data中
data.updata(kwargs)
super().__init__(data=data, status=status, headers=headers)
# 不要return,你可以这样做 self.data=data self.status=status