模块与包、反序列化校验源码分析、断言、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.detailelse: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_namevalidate_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.detailexcept DjangoValidationError as exc:errors[field.field_name] = get_error_detail(exc)except SkipField:passelse: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内置的(两个都支持)

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL 分表真的能提高查询效率?

背景 首先我们以InnoDB引擎,BTree 3层为例。我们需要先了解几个知识点:页的概念、InnoDB数据的读取方式、什么是树搜索?、一次查询花费的I/O次数,跨页查询。 页的概念 索引树的页(page)是指存储索引数据…

第十二章 异常-Exception

一、异常的概念(P444) Java 语言中,将程序执行中发生的不正常情况称为“异常”。(开发过程中的语法错误和逻辑错误不是异常) 执行过程中所发生的异常事件可分为两大类 (1)Error(错误…

链接未来:深入理解链表数据结构(二.c语言实现带头双向循环链表)

上篇文章简述讲解了链表的基本概念并且实现了无头单向不循环链表:链接未来:深入理解链表数据结构(一.c语言实现无头单向非循环链表)-CSDN博客 那今天接着给大家带来带头双向循环链表的实现: 文章目录 一.项目文件规划…

找不到msvcp120dll,无法继续执行代码的解决方法大全

当你尝试启动一个应用程序或游戏,并且遭遇到一个错误信息,告诉你“找不到msvcp120dll,无法继续执行代码”或者收到类似的提示,这说明你的操作系统中缺失了一个关键的动态链接库文件,即 msvcp120.dll。这种情况其实并不罕见&#x…

Android Studio 显示前进后退按钮

在写代码的过程中我们经常需要快速定位到先前或者往后的代码位置,可以使用Alt左右箭头 但是新安装的Android Studio工具栏上是没有显示左右箭头的工具按钮的,需要我们设置将Toolbar显示出来 View-Appearance-Toolbar 勾选即可 显示后

2024年安防行业预测:5G与安防视频监控技术的5大关键趋势

5G技术是一项以前所未有的速度和可靠性提供数据传输的技术,它的出现将极大地促进安防视频监控技术的发展。随着5G技术的快速发展,安防视频监控系统将在多个方面迎来显著的改进和创新。伴随着2023年进入尾声,2024即将到来,那么在20…

JS逆向基础

JS逆向基础 一、什么是JS逆向?二、接口抓包三、逆向分析 一、什么是JS逆向? 我们在网站进行账号登录的时候对网页源进行抓包就会发现我们输入的密码在后台会显示为一串由字母或数字等符号,这就是经过加密呈现的一段加密文字,而分…

学习Python后可以从事哪方面的工作呢?

Python是最适合用来做人工智能是编程语言,人工智能时代来临,Python人才缺口与日俱增,薪资也随之水涨船高,前景广阔。 Python做人工智能的好处:简单高效、优质的文档、强大的AI库、海量的模块,成为研究AI常…

【玩转TableAgent数据智能分析】借助全球高校数据多维度分析案例,体验TableAgent如何助力用户轻松洞察数据,赋能企业高效数智化转型

目录 前言 一、TableAgent介绍及其优势? 1、会话式数据分析,所需即所得 2、私有化部署,数据安全 3、支持企业级数据分析,大规模,高性能 4、支持领域微调,专业化 5、透明化过程,审计部署 二、使用Ta…

TCP服务器的演变过程:揭秘使用多线程实现一对多的TCP服务器

使用多线程实现一对多的TCP服务器 一、前言二、新增使用的API2.1、pthread_create() 函数2.2、pthread_exit()函数 三、实现步骤四、完整代码五、TCP客户端5.1、自己实现一个TCP客户端5.2、Windows下可以使用NetAssist的网络助手工具 小结 一、前言 手把手教你从0开始编写TCP服…

h5网站开发-页面底部 鼠标悬停显示二维码

一、实现效果 1.鼠标悬停到图标时&#xff0c;显示相应的二维码 2.二维码盒子的宽度是自适应的&#xff08;可以根据数量自动的撑开&#xff0c;并且居中显示&#xff09; 二、代码&#xff1a; <!DOCTYPE html> <html><head><meta http-equiv"Cont…

湖北省工程类助理工程师申报评审通过不是难事

湖北省工程类助理工程师申报评审通过不是难事 想要初级职称/助理工程师工程类&#xff0c;建筑施工、土木工程、市政、路桥、水利水电、机电、园林、测绘等一系列建筑类的初级职称。12月份交资料&#xff0c;春节前可以评审出来。 初级职称申报周期-一个月左右 一般初级职称申…