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 基础知识点 (元类)

  1. 在函数创建时 会先执行__new__方法创建类,再执行__init__实例化对象。
  2. 写函数时如果定义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__方法

3.2.4 查看ser.data 运行了什么

posted @ 2024-07-15 18:44  khalil12138  阅读(8)  评论(0编辑  收藏  举报