drf-基础组件
1、请求组件
1)将wsgi的request对象转化成drf的Request类的对象
2)封装后的request对象完全兼容wsgi的request对象,并且将原request保存在新request._request
3)重写格式化请求数据存放位置
拼接参数:request.query_params
数据包参数:request.data
源码分析:
# 入口:APIVIew的dispatch方法的 request=self.initialize_request(request, *args, **kwargs)
print(request._request.method) # 在内部将wsgi的request赋值给request._request
print(request.method) # 就是通过__getattr__走的是request._request.method
print(request.query_params) # 走的是方法属性,就是给request._request.GET重新命名
print(request.data) # 走的是方法属性,值依赖于request._full_data
图解:
请求模块调用过程:
请求模块二次封装过程
2、解析组件
解析模块:只处理数据包参数 - form-data,urlencoded,json
1)全局配置所有视图类的解析方式,解析配置可以配置三种
2)局部配置当前视图类的解析方式,解析配置可以配置三种
3)配置的查找顺序:局部(视图类的类属性) => 全局(settings文件的drf配置) => 默认(drf的默认配置)
注:该模块了解,但是全局局部配置是重点
源码分析:
入口:APIVIew的dispatch方法的 request=self.initialize_request(request, *args, **kwargs)
获取解析类:parsers=self.get_parsers(),
进行局部全局默认配置查找顺序进行查找:return [parser() for parser in self.parser_classes]
3、异常组件
3.1 源码分析
全局配置的异常处理函数只处理客户端的异常,不对服务端的异常做处理
图解:
调用过程:
处理过程:
3.2 自定义异常组件,扩展处理
1、settings.py配置,使得自定义的组件先起效
2、自定义组件,复用drf的异常组件,只是添加了服务器异常的处理
# drf框架自定义配置
REST_FRAMEWORK = {
# 异常模块:异常处理函数
'EXCEPTION_HANDLER': 'api.exception.exception_handler',
}
# 一定要在settings文件中将异常模块配置自己的异常处理函数
from rest_framework.views import exception_handler as drf_exception_handler
from rest_framework.response import Response
from rest_framework import status
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}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
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
4、渲染组件
五:渲染模块(了解):Postman请求结果是json,浏览器请求结果是页面
可以全局与局部配置
5、响应组件
响应数据:
data:响应数据
status:响应的网络状态码
template_name:drf完成前后台不分离返回页面,但是就不可以返回data(不许用了解)
headers:响应头,一般不规定,走默认
exception:一般异常响应,会将其设置成True,默认False(不设置也没事)
content_type:默认就是 application/json,不需要处理
自定义响应组件