day 71
day 71
02drf生命周期 - CBV
- (项目启动)APIView的as_view覆盖掉View的方法(在基础上局部禁用csrf)=> (接收到请求)调用as_view的返回值view,调用dispatch分发请求 => APIView重写了dispatch方法 => 在分发之前,对request进行了二次封装、对数据进行解析 => 三大认证 => 请求对实际响应,视图类的返回值 => 出现异常,就会交给异常处理模块进行处理 => 响应模块完成响应,渲染模块可以json或浏览器模式进行渲染
03drf的基础组件;请求、响应、渲染、解析、异常
- APIView 类继承了View类,重写了as_view 和 dispatch 方法
- 重写的as_view方法,主体还是View的as_view,只是在返回函数地址时,局部禁用了csrf认证
- 重写的dispatch方法,
01请求模块
- 将wsgi的request对象转化为drf的Requeset类的对象
- 封装后的request对象完全兼容wsgi的request对象,并且将原来的request保存在request._request
- 重新格式化请求数据存放位置
- 拼接参数;request.query_params
- 数据包参数;request.data
02解析模块
- 指粗粒数据包参数 - form-data,urlencoded,json
- 全局配置所有视图类的解析方式,配置三种
- 局部配置当前视图类的解析方式,配置三种
03响应模块
- data;响应数据
- status;响应的网络状态码
- template_name;drf完成前后台不分离,不需要了解
- headeers;响应头
- exception;一般异常响应,会将其设置为True,默认False
- content_type;默认就是application/json 不需要处理
04渲染模块
- 可以配置返回结果为json数据或页面数据
- postman请求结果是json,浏览器请求结果是页面
05异常模块
-
自定义异常处理函数;异常先交给drf处理,如果处理结果为空代表是服务端错误,再手动处理,不管哪种异常都要记录到日志文件当中
# 导入drf的异常处理函数exceptioin_handler并重命名方便调用 from rest_framework.views import exception_handler as drf_exception_handler # 对自定义的服务端错误信息进行封装 from rest_framework.response import Response # 导入drf内置响应状态码 from rest_framework import status # 重写异常处理函数 def exception_handler(exc, context): response = drf_exception_handler(exc, context) # 交给drf自带处理客户端错误 # 对错误信息进行格式化封装 发生错误的视图类 错误请求的请求方式 错误信息 detail = '%s - %s - %s' % (context.get('view'), context.get('request').method, exc) if not response: # response为空表示为,服务端错误 response = Response({'detail': detail}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) # status为给客户端返回的响应状态码 else: response.data = {'detail': detail} # 核心:要将response.data.get('detail')信息记录到日志文件 # logger.waring(response.data.get('detail')) import sys # 将异常信息以错误流的形式打印到终端 sys.stderr.write('异常:%s\n' % response.data.get('detail')) return response # 将处理好的响应数据返回出去
-
在settings中配置执行自定义异常处理函数
# drf框架自定义配置 REST_FRAMEWORK = { # 异常模块:异常处理函数 # 'EXCEPTION_HANDLER': 'rest_framework.views.exception_handler', drf自带异常处理函数 'EXCEPTION_HANDLER': 'api.exception.exception_handler', }