自我总结59
APIView生命周期
APIView的as_view(局部禁用csrf) => 走父级的as_view调用dispatch分发请求 => APIView自己重写了dispatch,使用自己完成分发 => 分发前完成request二次封装、数据解析 => 三大认证 => 请求的实际响应(自己的视图类的处理分发) => 出现了异常,就会交给异常模块处理异常 => 响应模块完成响应、渲染模块可以json或浏览器两种方式渲染
请求模块
将wsgi的request对象转化成drf的Request类的对象
封装后的request对象完全兼容wsgi的request对象,并且将原request保存在新request._request
重写格式化请求数据存放位置
拼接参数:request.query_params
数据包参数:request.data
解析模块
只处理数据包参数 - form-data
,urlencoded
,json
1 全局配置所有视图类的解析方式,解析配置可以配置三种
2 局部配置当前视图类的解析方式,解析配置可以配置三种
3 配置的查找顺序:局部(视图类的类属性) => 全局(settings文件的drf配置) => 默认(drf的默认配置)
局部配置
parser_classes = [JSONParser, FormParser, MultiPartParser]
全局配置(重点)
'DEFAULT_PARSER_CLASSES': [
'rest_framework.parsers.JSONParser',
'rest_framework.parsers.FormParser',
'rest_framework.parsers.MultiPartParser'
],
响应模块
data 响应数据
status 响应的网络状态码
Respose(data=常量|列表|字典, status=网络状态码)
渲染模块(了解)
局部配置
renderer_classes = [JSONRenderer, BrowsableAPIRenderer]
全局配置
'DEFAULT_RENDERER_CLASSES': [
'rest_framework.renderers.JSONRenderer',
'rest_framework.renderers.BrowsableAPIRenderer', # 上线后尽量关闭
],
异常模块
'''
settings中配置:'EXCEPTION_HANDLER': 'api.exception.exception_handler',
重写exception_handler方法:
'''
# 一定要在settings文件中将异常模块配置自己的异常处理函数
from rest_framework.views import exception_handler as drf_exception_handler
from rest_framework.response import Response
# 先交个drf处理客户端异常,如果结果response为None代表服务器异常,自己处理
# 最终一定要在日志文件中记录异常现象
def exception_handler(exc, context):
response = drf_exception_handler(exc, context)
detail = '%s - %s - %s' % (context.get('view'), context.get('request').method, exc)
if not response: # 服务端错误
response = Response({'detail': detail})
else:
response.data = {'detail': detail}
# 核心:要将response.data.get('detail')信息记录到日志文件
# logger.waring(response.data.get('detail'))
return response