模块与包、反序列化校验源码分析、断言、drf之请求、drf之响应

模块与包

什么是模块?

一个py文件,被别的py文件导入使用,它就是模块
如果py文件,直接右键运行,它叫脚本文件

什么是包?

一个文件夹,下有 __init__.py ,和很多py文件,这个就是包

导入模块或包使用的规则

    0 导入模块有相对导入和绝对导入,绝对的路径是从环境变量开始的
    1 导入任何模块,如果使用绝对导入,都是从环境变量开始导入起  
        import xx  #### xx所在路径必须在环境变量
        from yy  import   ####yy所在路径必须在环境变量中

    2 脚本文件执行的路径,会自动加入环境变量

    3 相对导入的话,是从当前py文件开始计算的

    4 以脚本运行的文件,不能使用相对导入,只能用绝对导入
    5 pycharm 会把项目根路径加入到环境变量---》离开pycharm就不行了
    6 咱们看到第三方包,都是绝对导入
        form 它自己的包名 import xx
        下载的第三方包,都在site-package中,而site-package一定在环境变量中

 

反序列化校验源码分析(了解)

1  执行 ser.is_valid() 就会执行 反序列化的校验---》字段自己--》局部钩子---》全局钩子
2  入口是:ser.is_valid()---》BaseSerializer 找到了

        自己写的BookSerializer---》serializer.Serializer---->BaseSerializer

    def is_valid(self, *, raise_exception=False):
        # self 是 ser对象---》自己写的BookSerializer的对象--》一开始没有
        # 一旦有了,就不执行了,优化is_valid被多次调用,只会走一次校验
        if not hasattr(self, '_validated_data'):
            try:
                # 一旦执行过,以后self中就有_validated_data
                # 接下来看self.run_validation(self.initial_data)
                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)

3 self.run_validation(self.initial_data)---》serializer.Serializer类的,不要按住ctrl点击,否则会进 Field 类,看错了

4 serializer.Serializer类的run_validation

        def run_validation(self, data=empty):
            # data前端传入的--{"name":"张三","age":68}
            # value是---》前端传入的,字段自己校验通过的字典---{"name":"张三","age":68}
            value = self.to_internal_value(data) # 执行局部钩子
            try:
                self.run_validators(value) # 先不看,忽略掉
                # self 是 BookSerializer的对象,如果我们写了全局钩子,走我们自己的,如果没写,走父类的,父类的根本没做校验
                # value={"name":"张三","age":68}
                value = self.validate(value)# 执行全局钩子
            except (ValidationError, DjangoValidationError) as exc:
                raise ValidationError(detail=as_serializer_error(exc))

            return value
        

5 全局钩子读完了:self 是 BookSerializer的对象,如果我们写了全局钩子,走我们自己的,如果没写,走父类的,父类的根本没做校验

6 局部钩子:value = self.to_internal_value(data)--》Serializer类的

        # for循环着去BookSerializer的对象中反射  validate_字段名的方法,如果有就执行,没有就不执行
     def to_internal_value(self, data):
        for field in fields: # 序列化类中所有字段类的对象 name=CharField()
            # self 是BookSerializer类的对象
            # 去BookSerializer类中,反射  validate_field字段类的对象.field_name
            validate_method = getattr(self, 'validate_' + field.field_name, None)
            try:
                # 如果能拿到,说明咱么写了局部钩子
                if validate_method is not None:
                    # 执行局部钩子--》传入了当前字段的value值
                    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

读了局部和全局钩子的执行位置
保存,修改也好,都要用validated_data,它是最准确的

关于self问题

从哪开始看的---》一定从根上找

断言

a = 10

## assert 后写条件,只要不符合条件,就会抛AssertionError异常,后面写异常信息
assert a == 11, ("不等于11,报错了")

# 等同于---》上面只要一行代码,源码中喜欢用
if not a == 11:
    raise Exception('不等于11,报错了')
    
    
   

# 源码中使用
assert value is not None, '.validate() should return the validated data'

drf之请求

默认,视图类的方法,可以处理任意编码格式

  • urlencoded
  • form-data
  • json

比如有的接口,只能接收json格式,其他格式都不能处理

# 配置方式一:视图类上配置
from rest_framework.parsers import JSONParser, FormParser, MultiPartParser
# JSONParser:json
# FormParser:urlencoded
# MultiPartParser:form-data
class TestView(APIView):
    # parser_classes = [JSONParser]
    parser_classes = [JSONParser,FormParser]
    def post(self, request):
        print(request.data)
        return Response('ok')
    
# 配置方式二:settings.py  配置文件中配置
	### 所有drf的配置,都要写在REST_FRAMEWORK 字典中
    REST_FRAMEWORK = {
        'DEFAULT_PARSER_CLASSES': [
            # 'rest_framework.parsers.JSONParser',
            # 'rest_framework.parsers.FormParser',
            'rest_framework.parsers.MultiPartParser',
        ],
    }
    
    
# 全局使用某种,单某个视图类,局部使用---》优先用视图类配置的---》视图类没配置--》项目配置文件---》项目配置文件如果没配置---》drf配置文件(默认三个都支持)
	-配置文件正常写
    class TestView(APIView):
        parser_classes = [JSONParser,FormParser]

drf之响应

from rest_framework.response import Response

源码

data=None  # 咱们给的字典或列表或字符串---》最终放到了http响应体中返回了
status=None #http响应状态码,默认是200,你可以改,改成from rest_framework import status 状态码   		   http响应状态码分别代表啥意思:200成功   201 创建成功
template_name=None:用浏览器访问好看的页面--》指定的--》默认使用drf提供的--》后期可以自己写页面,使用 
headers=None, #响应头
content_type=None # 响应编码格式


## 你需要记住的
data
status
headers

响应编码格式

# 配置方式跟请求解析类似

# 方式一:在视图类上配置
class TestView(APIView):
    renderer_classes = [JSONRenderer,BrowsableAPIRenderer]
# 方式二:配置文件中配置
REST_FRAMEWORK = {
    'DEFAULT_RENDERER_CLASSES': [
        'rest_framework.renderers.JSONRenderer',
        'rest_framework.renderers.BrowsableAPIRenderer',
    ],

}

# 优先用 视图类的---》项目配置文件---》drf内置的(两个都支持)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/266372.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu 常用命令之 scp 命令用法介绍

📑Linux/Ubuntu 常用命令归类整理 SCP(Secure Copy)是一种基于SSH(Secure Shell)的文件传输协议,它可以在本地和远程主机之间安全地复制文件。在Ubuntu系统下,我们可以使用scp命令来实现这个功…

tcp 的限制 (TCP_WRAPPERS)

#江南的江 #每日鸡汤:青春是打开了就合不上的书,人生是踏上了就回不了头的路,爱情是扔出了就收不回的赌注。 #初心和目标:拿到高级网络工程师 TCP_WRAPPERs Tcp_wrappers 对于七层模型中是位于第四层的安全工具,他…

零成本搭建一款博客网站(基于Vercel+Hexo完美实现)【保姆级教程】

文章目录 🐸基于VercelHexo零成本搭建博客网站🐻实现思路 🐮Hexo的配置与安装🐒Hexo的美化与使用🐫Github的推送与部署🐼Vercel部署与网站上线🐛总结 🐸基于VercelHexo零成本搭建博客…

冬至·特辑:Note4---二叉树的链式结构

目录 前言🧶 1. 二叉树链式结构的实现🐧 1.1 要实现的目标🎯 2.二叉树的创建🌹 2.1代码实现 2.1.1 TreeNode.h 2.1.2 TreeNode.c 3.实现二叉树的遍历🐲 3.1 思路分析🐤 3.2 前/中/后序遍历&#…

IDEA 中 Tomcat 日志乱码

1、服务器输出乱码 修改 File -> settings -> Editor -> General ->Console 中,utf-8改为GBK,反之改成utf-8 2、Tomcat Localhost Log 或者 Tomcat Catalina Log乱码 进入Tomcat 中的conf文件中的logging.properties 哪个有问题改哪个&…

1223西站坐标更新

1223 西站坐标更新 1.Update for the station’s location def initial_out_map_indoor_points(self):Load the indoor data and update both the wall_matrix and the ditch_matrix.# Initialize the wall_matrix# List of coordinatescoordinates [(417, 287, 417, 290),(4…

Java--抽象工厂设计模式

抽象工厂设计模式 抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 在抽象工厂模式中,接口是负责…

考研往应届考生报名流程?

文章目录: 一:考试时间相关 二:公告查询获取信息 三:提供材料 1.基本要求 2.证件要求 四:相关问题 1.报名流程如何操作 2.考点选择 2.1 应届考生考点选择 2.2 往届考生考点选择 3.预报名时间可能不同 4.档…

Python编程 圣诞树教程 (附代码)专属于程序员的浪漫

文章目录 1.turtle库2.python函数的定义规则3.引入库4.定义画彩灯函数5.定义画圣诞树的函数6.定义树下面小装饰的函数7.定义一个画雪花的函数8.画五角星9.写文字10.全部源代码11.html圣诞树代码实现(动态音乐) 1.turtle库 turtle库是Python语言中一个很…

Java LocalDateTime转Json报错处理

在项目中LocalDateTime 进行json转换时,抛出序列化异常,查找解决方案,记录下来,方便备查。 报错信息 Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Java 8 date/time type java.time.LocalDateT…

【小白攻略】php 小数转为百分比,保留两位小数的函数

php 小数转为百分比 首先,最简单直观的方法是利用PHP内置的number_format函数。该函数可以对一个数字进行格式化,并可以设置小数点后的精度。通过将小数乘以100,再用number_format函数将结果格式化为百分比形式,即可达到将小数转为…

基于Java SSM框架实现多人试卷批改考试命题系统项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架实现多人试卷批改考试命题系统演示 摘要 多人命题系统是高校为教师、学生试卷的重要组成部分,是实现人才培养目标、培养学生科研能力与创新思维、检验学生综合素质与实践能力的重要手段与综合性实践教学环节。我所在学院多采用半手工管理学生试卷…

什么是动态代理?

目录 一、为什么需要代理? 二、代理长什么样? 三、Java通过什么来保证代理的样子? 四、动态代理实现案例 五、动态代理在SpringBoot中的应用 导入依赖 数据库表设计 OperateLogEntity实体类 OperateLog枚举 RecordLog注解 上下文相…

车云TCP链路偶现链接失联问题排查

一、问题分析 1.1 车云tcp长连接分析排查 在15:37:32.039上线, 在 16:07:26.527下线,车云长连接通道稳定,且该期间心跳数据正常。 1.2 云向驾仓推送数据分析 在15:37:42 进行车辆接管后,该车辆下线,且无法在上线&am…

Java语法---使用sort进行排序

目录 一、升序 二、降序 (1)类实现接口 (2)匿名内部类 三、自定义排序规则 四、集合中的sort排序 (1)升序 (2)降序 (3)自定义排序 一、升序 升序排…

vue3+Ts

安装 命令含义可参考typescript文章中的自动编译部分 npm create vitelatest vuets-project -- --template vue-tsvs code插件 Vue Language Features (Volar)对.vue文件进行实时的类型错误反馈TypeScript Vue Plugin (Volar) 用于支持在TS中import*.vue文件(mai…

08-JVM调优实战及常量池详解

文章目录 阿里巴巴Arthas详解Arthas使用场景Arthas使用 GC日志详解打印GC日志方法如何分析GC日志CMSG1 JVM参数汇总查看命令Class常量池与运行时常量池字面量符号引用 字符串常量池字符串常量池的设计思想三种字符串操作(Jdk1.7 及以上版本)字符串常量池位置字符串常量池设计原…

C语言——高精度除法

一、引子 1、引言 高精度除法相较于加减乘法更加复杂,它需要处理的因素更多,在这里我们先探讨高精度数除以低精度数,即大数除小数。这已满足日常所需,如需大数除以大数,可以使用专门的库,例如&#xff1a…

3.Redis持久化

文章目录 RDB(Redis DataBase):RDB是什么?RDB能干嘛?RDB自动触发RDB手动触发RDB优点RDB缺点什么情况会触发RDB快照 AOF(Append Only File):AOF是什么?AOF能干嘛&#xff…

【Hadoop】 YARN 运行过程/YARN设计目标

YARN 运行过程剖析YARN设计目标 YARN 运行过程剖析 一个Job在YARN中的处理过程: 客户端向RM提交一个job,进入RM中的调度器队列以供调度RM中的AppManager与NM协商协商好一个容器,以启动一个App Master实例App Master启动之后向RM注册并根据Jo…