首页 > 编程语言 >drf之反序列化校验源码分析 、 断言 、drf之请求和响应

drf之反序列化校验源码分析 、 断言 、drf之请求和响应

时间:2023-05-19 18:55:20浏览次数:43  
标签:self value --- 源码 视图 序列化 data drf

目录

一、反序列化校验源码分析

序列化类的校验功能

-局部钩子:必须 validate_字段名
-全局钩子: validate

入口:

-ser.is_valid 才做的校验---》入口
-BookSerializer---》Serializer——-》BaseSerializer---》is_valid---》继承了Field
-is_valid 方法

先来到BaseSerializer类中找到is_valid方法

        def is_valid(self, *, raise_exception=False):
            # self中没有_validated_data,只有执行完后,才有
            if not hasattr(self, '_validated_data'):
                try:
                    # 核心---》这一句
                    # 想看它的源代码,按住ctrl+鼠标点击是不对的---》只能找当前类的父类
                    #但它真正的执行是,从根上开始找
                    self._validated_data = self.run_validation(self.initial_data)
                except ValidationError as exc:
                    self._validated_data = {}
                    self._errors = exc.detail
                else:
                    self._errors = {}

            if self._errors and raise_exception:
                raise ValidationError(self.errors)

            return not bool(self._errors)

-self.run_validation(self.initial_data),不能按住ctrl+鼠标点点击,要从根上开始找
image
-来到Serializer类中的run_validation方法

        def run_validation(self, data=empty):
             # 局部钩子
            value = self.to_internal_value(data)
            try:
                # 全局钩子
                value = self.validate(value) # BookSerializer只要写了,优先执行它的
            except (ValidationError, DjangoValidationError) as exc:
                raise ValidationError(detail=as_serializer_error(exc))

            return value

局部钩子的分析:-self.to_internal_value(data)---》Serializer类的方法

        def to_internal_value(self, data):
            for field in fields: #序列化类中写的一个个的字段类的对象列表
                # 一个field是name对象,field.field_name字符串 name
                # self是谁的对象:序列化类的对象,BookSerializer的对象  validate_name
                validate_method = getattr(self, 'validate_' + field.field_name, None)
                try:
                    # 字段自己的校验规则
                    validated_value = field.run_validation(primitive_value)
                    if validate_method is not None:
                        # 局部钩子
                        validated_value = validate_method(validated_value)
                except ValidationError as exc:
                    errors[field.field_name] = exc.detail
                except DjangoValidationError as exc:
                    errors[field.field_name] = get_error_detail(exc)
                except SkipField:
                    pass
                else:
                    set_value(ret, field.source_attrs, validated_value)

            if errors:
                raise ValidationError(errors)

            return ret

总结:

-ser.is_valid---》走局部钩子的代码---》是通过反射获取BookSerializer中写的局部钩子函数,如果写了,就会执行----》走全局钩子代码---》self.validate(value)--->只要序列化类中写了,优先走自己的

二、断言

assert hasattr(self, 'initial_data'), (
            'Cannot call `.is_valid()` as no `data=` keyword argument was '
            'passed when instantiating the serializer instance.'
        )

东西是我认为的,如果不是就抛异常
等同于if判断+抛异常断定某个东西是我认为的,如果不是就抛异常
等同于if判断+抛异常

def add(a, b):
    return a + b

res = add(8, 9)
# assert res == 16, Exception('不等于16')
if not res==16:
    raise Exception('不等于16')
print('随便')

三、drf之请求

视图类:APIView
序列化组件:Serializer,ModelSerializer
drf:Request类的对象
drf:Response

3.1 Request类对象的分析

.data

request.data 返回解析之后的请求体数据。类似于Django中标准的request.POST和 request.FILES属性,但提供如下特性:
包含了解析之后的文件和非文件数据
包含了对POST、PUT、PATCH请求方式解析后的数据
利用了REST framework的parsers解析器,不仅支持表单类型数据,也支持JSON数据

.query_params

request.query_params与Django标准的request.GET相同,只是更换了更正确的名称而

其他的属性用起来跟之前一样

3.2 请求,能够接受的编码格式

urlencoded
form-data
json
三种都支持

限制只能接受某种或某几种编码格式

限制方式一:在视图类上写---》只是局部视图类有效

# 总共有三个:JSONParser, FormParser, MultiPartParser
class BookView(APIView):
	parser_classes = [JSONParser, FormParser]

限制方式二:在配置文件中写---》全局有效

# drf的配置,统一写成它
REST_FRAMEWORK = {
    'DEFAULT_PARSER_CLASSES': [
        'rest_framework.parsers.JSONParser',
        # 'rest_framework.parsers.FormParser',
        # 'rest_framework.parsers.MultiPartParser',
    ],
}

全局配置了只支持json,局部想支持3个

-只需要在局部,视图类中,写3个即可
class BookView(APIView):
	parser_classes = [JSONParser, FormParser,MultiPartParser]

总结:能够处理的请求方式编码

-优先从视图类中找
-再去项目配置文件找
-再去drf默认的配置中找

四、drf之响应

4.1 响应类的对象Response

image

return Response({code:100})

data:

响应体的内容,可以字符串,字典,列表

status:

http响应状态码
drf把所有响应码都定义成了一个常量

template_name:

模板名字,用浏览器访问,看到好看的页面,
-自定制页面
-根本不用
用postman访问,返回正常数据

headers:

响应头加数据(后面讲跨域问题再讲)
-headers={'name':'lqz'}

content_type:

响应编码,一般不用
三个重要的:data,status,headers

4.2 响应的格式

默认是两种:纯json,浏览器看到的样子

限制方式一:在视图类上写---》只是局部视图类有效

# 总共有两个个:JSONRenderer,BrowsableAPIRenderer
from rest_framework.renderers import JSONRenderer,BrowsableAPIRenderer
class BookView(APIView):
    renderer_classes = [JSONRenderer]

限制方式二:在配置文件中写---》全局有效

# drf的配置,统一写成它
 REST_FRAMEWORK = {
    'DEFAULT_RENDERER_CLASSES': [
        'rest_framework.renderers.JSONRenderer',
        # 'rest_framework.renderers.BrowsableAPIRenderer',
    ],
}

全局配置了只支持json,局部想支持2个

-只需要在局部,视图类中,写2个即可
from rest_framework.renderers import JSONRenderer,BrowsableAPIRenderer
class BookView(APIView):
    renderer_classes = [JSONRenderer,BrowsableAPIRenderer]

标签:self,value,---,源码,视图,序列化,data,drf
From: https://www.cnblogs.com/yuezongke/p/17415848.html

相关文章

  • java中把对象序列化成php序列化的字符串以及把php序列化的字符串反序列化为java对象的
    依赖第三方库phprpc序列化成php格式的字符串很简单,直接调用org.phprpc.util.PHPSerializer.serializer方法就行,有问题的是反序列化php格式的字符串为List或Map对象时,得到的是个AssocArray对象,需要写方法进行转换。通过下面这个方法可以实现转为java对象。publicstati......
  • uni.request(OBJECT)前端post请求数据json序列化
    一、uni-app前端post请求数据json序列化1.前置须知Content-Type实体头部用于指示资源的MIME(媒体)类型mediatype。在响应中,Content-Type标头告诉客户端实际返回的内容的内容类型。在请求中,客户端告诉服务器实际发送的数据类型。2.uni.request({})官方文档2.1dat......
  • DCC32命令行方式编译delphi工程源码
    本文链接地址:http://blog.csdn.net/sushengmiyan/article/details/10284879作者:苏生米沿 一、首先找到这个可执行文件,熟悉delphi的人应该很容易就找到,打开你安装delphi的目录,如我的路径C:\ProgramFiles\Delphi_2007\bin\DCC32.EXE二、拷贝一份出来,我将其放在了我的测试目录下......
  • 2023最新OneTool多平台助手程序源码
    2023最新OneTool多平台助手程序源码开心可用版本:https://download.csdn.net/download/mo3408/87799108OneTool 是一款功能强大的多平台助手,目前最新版本为199911(1.9.1)。除此之外,该应用程序还拥有其他好玩的功能,等着您们来搭建测试。可以帮助用户快速完成各种任务。例如网......
  • APP中RN页面热更新流程-ReactNative源码分析
    平时使用WebStorm或VSCode对RN工程中的文件修改后,在键盘上按一下快捷cmd+s进行文件保存,此时当前调试的RN页面就会自动进行刷新,这是RN开发相比于原生开发一个很大的优点:热更新。那么,从按一下快捷cmd+s到RN页面展示出最新的JS页面,这个过程是怎样发生的呢?下面根据时间顺序来梳理一下......
  • Sentinel基本使用与源码分析
    系列文章目录和关于我一丶什么是SentinelSentinel官网Sentinel是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。流量整形:限制流......
  • drf——序列化之source(了解)、定制字段的两种方式(重要)、多表关联反序列化保存、反
    1序列化高级用法之source(了解)#1.创建了5个表(图书管理的5个)#2.对book进行序列化#总结:source的用法 1.修改前端看到的字段key值--->source指定的必须是对象的属性 book_name=serialiazers.CharField(source='name')2.修改前端看到的value值--->source指......
  • 序列化高级用法之source,序列化高级用法之定制字段的两种方式,多表关联反序列化保存,反序
    序列化高级用法之source:source的用法:1修改前端看到的字段key值---》source指定的必须是对象的属性: 前端展示效果: 2. 修改前端看到的value值,---》source指定的必须是对象的方法models中: 序列化类中: 前端展......
  • 序列化的高级用法与ModelSerializer的使用
    序列化的高级用法与ModelSerializer的使用序列化高级用法之source(了解)source的三个用法:1.取别名: book_name=serializers.CharField(source='name')#book_name为前端可以看到的字段值,name是对象真实的属性。注意:别名和真实属性不能相同2.美化值: #......
  • 东邻到家小程序|东邻到家小程序源码|东邻到家小程序开发功能
    上门服务这几年已经越来越火爆,不论是家政、按摩、美甲等等都在不断的发展上门服务,这几年东邻到家小程序系统在不断的摸索阶段,对于系统各方面的需求也在不断提升,东郊到家小程序通过线上匹配用户和技师的需求,让人们可以更加容易的享受上门服务,下面小编就给大家介绍下东邻到家小程序系......