2. DRF 解析器
目录
Django DRF 解析器
1. 解析器作用
request请求先进到APIView的dispatch方法, 如果有异常走到exception。
Json请求
www-form 请求
form-data请求
可以看到不同类型的请求, request.data 拿到的对象不同, Json格式拿到的是字典, www-form和form-data拿到的是queryset。
2. 使用
解析器默认配置
可以看到drf默认配置了三个解析器
为视图类定义解析器
在视图类中可以只定义单个解析器
class Home(APIView):
from rest_framework.parsers import JSONParser
parser_classes = [JSONParser]
def get(self, request, *args, **kwargs):
print(request.content_type)
print(request.data)
return Response({'status': "OK"})
修改全局配置
在settings.py中添加
REST_FRAMEWORK = {
'EXCEPTION_HANDLER': 'app01.utils.handlers.exception_handler',
'DEFAULT_PARSER_CLASSES': [
'rest_framework.parsers.JSONParser'
]
}
3.源码讲解
3.1 基础知识点 (元类)
- 在函数创建时 会先执行__new__方法创建类,再执行__init__实例化对象。
- 写函数时如果定义metaclass=一个类, 那么函数将由这个类创建。
class SerializerMetaclass(type):
def __new__(cls, name, bases, attrs):
data_dict = {}
for k,v in list(attrs.items()):
if isinstance(v, int):
data_dict[k] = attrs.pop(k)
attrs['_declared_fields'] = data_dict
return super().__new__(cls, name, bases, attrs)
class Field:
pass
class BaseSerializer(Field):
pass
class Serializer(BaseSerializer, metaclass=SerializerMetaclass):
pass
class UserInfoSerializer(Serializer):
v1 = "12313"
v2 = "123123"
v3 = 123123
print(UserInfoSerializer._declared_fields)
3.2 源码分析
3.2.1 创建参数
第三步执行父类的封装方法
super().init(**kwargs)
3.2.2 创建类
创建类需要执行__new__方法
3.2.3 实例化类
实例化需要先使用object类的__new__, 再使用__init__方法