DRF从入门到精通三(反序列化数据校验源码分析、断言Assert、DRF之请求、响应、两个视图基类)

本文详细剖析了DRF中的反序列化数据校验流程,包括字段验证规则、局部钩子和全局钩子的执行,以及Request和Response类在处理不同数据格式时的作用。同时介绍了如何在DRF视图中配置解析器和渲染器。

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

反序列化数据校验,校验顺序为:先校验字段自己的规则(最大、最小),然后是局部钩子,然后是全局钩子

  1. 反序列化校验开始
    在视图类中的s_valid()被执行时,就会进行反序列化的校验,校验通过返回True,否则返回False

  2. 反序列化的过程

    • ser.is_valid()是序列化类的对象,假设序列化类是BookSerializer,当执行is_valid时。首先在序列化类产生的对象中查找,当找不到就会去找到它的父类中找,结果在它父类的父类中找到了BaseSerializer
	BaseSerializer类
	 def is_valid(self, *, raise_exception=False):
	 	'断言检查,确保类的实例中具有名为initial_data的属性,如果没有就引发下面这段话包含的特定的错误信息'
        assert hasattr(self, 'initial_data'), (
            'Cannot call `.is_valid()` as no `data=` keyword argument was '
            'passed when instantiating the serializer instance.'
        )
		
        if not hasattr(self, '_validated_data'):
        	'''
            self序列化类的对象,属性中没有_validated_data,就一定会走这句
           	并且只要走过一次后,下一次就无需再次走了,它优化了is_valid被多次调用,只会走一次校验
           	'''
            try:
            	'真正的走校验,一旦执行了这里,以后self中就有了_validated_data'
            	'''
				然后我们就得去看看这个self.run_validation(self.initial_data)
				我们不能直接按住ctrl键点击,因为它会从当前类中找run_validation,
				我们得清楚,这个self是谁,它还是我们的视图类,所以我们得返回到视图类从它一步一步往它继承的类中找
				清楚如何查找后,我们就从视图类----》serializer.Serializer(找到了,为什么从这个里面找因为
				我们就是使用serializer.Serializer类的)
				'''
                self._validated_data = self.run_validation(self.initial_data)
                '''
                这下面的是当校验不通过时,执行的,会给_validatad_data设置为一个空字段,
                并且给_errors设置为验证错误的详细信息
                '''
            except ValidationError as exc:
                self._validated_data = {
   
   }
                self._errors = exc.detail
            else:
                self._errors = {
   
   }
        return not bool(self._errors)


		通过上面self.run_validation(self.initial_data)我们找到了下面这块源码,
		而这里的run_validatiion方法就是DRF序列化器验证过程中的核心
		
		def run_validation(self, data=empty):
			'''
			局部钩子的执行,这里的self就还是视图类的对象
			data就是前端传入的数据,value是前端传入,字段自己校验通过的字典
			'''
	        value = self.to_internal_value(data)
	        try:
	        	'这个是字段验证器'
	        	self.run_validators(value)
	        	'''
	        	这个是全局钩子的执行,和上面一样self是视图类的对象,如果我们在序列化其中写了全局钩子,
	        	那么就优先使用我们自己定义的全局钩子,如果没写则执行父类的,(serializer.Serializer)
	        	结果可以看到父类根本就没有做校验
	        	    def validate(self, attrs):
       					 return attrs
	        	'''
	            value = self.validate(value)  #运行自定义验证方法
	            '确保自定义验证方法返回了验证后的数据'
	            assert value is not None, '.validate() should return the validated data'
	        except (ValidationError, DjangoValidationError) as exc:
	        # 捕获验证过程中可能引发的异常,并转换为DRF的ValidationError
	            raise ValidationError(detail=as_serializer_error(exc))
			# 返回验证后的数据
	        return value
		
		看完了全局钩子后我们在看一下局部钩子的self.to_internal_value(data),也是一样的思路,从视图类找,
		视图类肯定没有,然后找父类serializer结果就是这个页面的
		def to_internal_value(self, data):
			ret = OrderedDict()# 用于存储验证后的数据
	        errors = OrderedDict()# 用于存储字段验证过程中的错误信息
	        fields = self._writable_fields# 获取序列化器中的所有字段
	       '序列化类中所有的字段,for循环每次取一个字段对象。例如name=CharField()'
	        for field in fields: 
	        '''去视图类的对象中反射,validate_字段名的方法,如果有就执行,没有就不执行'''
	            validate_method = getattr(self, 'validate_' + field.field_name, None)
	            primitive_value = field.get_value(data)
	            try:
	            	'这句话就是字段自己的校验规则(最长最短长度等)'
	                validated_value 
Django REST framework(DRF)是一个强大且灵活的工具,用于构建Web API。它建立在Django这个高级的Python Web框架之上,提供了一套清晰、简单而且非常强大的工具来构建Web API。 入门DRF,首先需要了解Django的基础知识。Django是一个开源的高级Web框架,鼓励快速开发和干净、实用的设计。熟悉Django之后,你可以开始学习DRF。以下是入门精通的一些步骤: 1. 安装DRF:通过Python的包管理工具pip来安装DRF。在命令行中运行`pip install djangorestframework`。 2. 配置DRF:在Django项目的`settings.py`文件中添加`rest_framework`到`INSTALLED_APPS`列表中。 3. 创建序列化器:序列化器(Serializers)用于将模型实例转换成JSON格式的输出,以及将JSON格式的输入转换回Python数据类型。在DRF中,序列化器是处理数据转换的核心。 4. 编写视图DRF提供了许多内置的视图类,比如`APIView`、`ListAPIView`、`RetrieveAPIView`等,可以方便地处理请求响应。自定义视图类来添加业务逻辑。 5. 定义URL路由:在Django的`urls.py`文件中定义API的URL路由,并将它们关联到相应的视图上。 6. 测试API:使用DRF提供的测试客户端进行API的测试。 精通DRF需要对以下几个方面有深入的理解和实践: 1. 视图集(ViewSets):视图集提供了一种方便的方式来编写一组相关的视图DRF将相关的逻辑组织在一起,使得代码更加模块化和可重用。 2. 权限(Permissions)和认证(Authentication):管理API的安全性,确保只有合适的用户才能访问和修改数据。 3. 分页(Pagination):在API中实现分页,提高数据的传输效率和用户的交互体验。 4. 自定义行为:包括自定义过滤器、解析器、异常处理、版本控制等高级特性,以适应复杂的业务需求。 5. 性能优化:包括序列化器字段的选择、查询集的优化、缓存策略等,以提高API的性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值