drf
DRF框架
- 提供了可视化的API调试界面,开发者可以在线测试接口
- 提供了各种身份验证策略
- 提供了orm和orm数据的序列化支持
- 支持视图函数
- 大量的文档和视图
- 安装到Django工程中,能在Django中提供Restful接口
- 可以在一个web页面上浏览自己提供了哪些API,并可以通过这个页面测试API
- 不用自己写一套接口鉴权代码
- 不用自己写大量的CRUD接口,简单配置即可
- 不用自己写大量的条件查询接口,简单配置即可
- 不用自己写后台分页逻辑,简单配置即可
- 不用自己写接口限流逻辑,简单配置即可
- 不用自己写各种简单的参数校验逻辑,简单配置即可
- 不用自己注册各种路由,简单配置即可
- 权限逻辑不用写到业务逻辑中
- DRF不受csrf认证限制
APIView请求生命周期
- APIView类继承了View类,重写了as_view和dispatch方法
- 重写的as_view方法,主体还是View的as_view,只是在返回视图的view函数地址时,局部禁用csrf认证;
- 重写的dispatch方法:
- 在执行请求逻辑前,请求模块(二次封装request)、解析模块(三种数据包格式的数据解析);
- 在执行请求逻辑中,异常模块(执行出现任何异常交给异常模块处理);
- 在执行请求逻辑后,响应模块(二次封装response)、渲染模块(响应的数据能JSON和页面两种渲染);
APIView的 as_view (局部禁用csrf) => 走父级的 as_view 调用dispatch分发请求 => APIView自己重写了dispatch,使用自己完成分发 => 分发前完成request二次封装、数据分析 => 三大认证 => 请求的实际响应(自己的视图类的处理分发) => 出现了异常,就会交给异常模块处理异常 => 响应模块完成响应、渲染模块可以json或浏览器两种方式渲染
请求模块
- 将wsgi的request对象转化成drf的Request类的对象;
- 封装后的request对象完全兼容wsgi的request对象,并将原来的request保存在新request._reqyeset中_
拼接参数:request_.request 被 request完全兼容
数据包参数:request.query_params | request.data
解析模块
只处理数据包参数form-data、urlencoded、json
- 全局配置所有视图类的解析方式,解析配置可以配置三种(重点)
- 局部配置当前视图类的解析方式,解析配置可以配置三种
- 配置的查找顺序,局部(视图类的类属性)=> 全局(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:响应的网络状态码
- template_name:drf完成前后台不分离返回页面,但是不能返回data
- headers:响应头,一般不规定,使用默认
- exception:一般异常响应,会将其设置成True,默认False(不设置也可以)
- content_type:默认就是application/json,不需要处理
Respose(data=常量|列表|字典,status=网络状态码)
渲染模块
Postman请求结果时json,浏览器请求结果是页面
局部配置
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
浙公网安备 33010602011771号