DRF之解析器源码解析
解析器
RESTful一种API的命名风格,主要因为前后端分离开发出现
前后端分离: 用户访问静态文件的服务器,数据全部由ajax请求给到
解析器的作用就是服务端接收客户端传过来的数据,把数据解析成自己想要的数据类型的过程。
本质就是对请求体中的数据进行解析。
在了解解析器之前~大家要先知道Accept以及ContentType请求头。
Accept是告诉对方我能解析什么样的数据,通常也可以表示我想要什么样的数据。
ContentType是告诉对方我给你的是什么样的数据类型。
那大家想一下,解析器工作原理的本质应该是什么~~~~~
就是拿到请求的ContentType来判断前端给我的数据类型是什么,然后我们去拿相应的解析器去解析数据。
Django的解析器
我们请求进来请求体中的数据在request.body中,那也就证明,解析器会把解析好的数据放入request.body
我们在视图中可以打印request的类型,能够知道request是WSGIRequest这个类。
application/x-www-form-urlencoded不是不能上传文件,是只能上传文本格式的文件,
multipart/form-data是将文件以二进制的形式上传,这样可以实现多种类型的文件上传
一个解析到request.POST, request.FILES中。
也就是说我们之前能在request中能到的各种数据是因为用了不同格式的数据解析器~
DRF的解析器
我们说 请求数据都在request.data中,那我们看下这个Request类里的data
我们知道,data肯定是个静态方法,进源码:
只要请求过来了,我们就会走APIView里边的dispatch方法,
这个时候里边的request是重新封装的新的request,



经过dispatch方法,构建了是一个Request实例化对象,然后执行request.data,去源码request里边找一个静态方法data。这个data方法肯定是选择解析器的。

点进去:


用户提交的请求头content_type的值,不拿这个值做不了解析。stream是请求体,我们拿到这个了之后做解析:



选择解析器:



首先看我们的self是谁,




最终就是self是我们的自定义的类对象。
然后我们去我们的courseview里边找parser_classes

看我们自己类里边有没有,我们去过自定义了,就直接调用,有几个是几个。

拿到解析类对象列表之后,看谁调用它:


这个整个流程还没有走完,如果没有定义parser_classes = []这个变量,源码应该怎么走,去APIView走。



我们需要找这个属性

所以走getattr:

所以继续往下走:


点击settings:

补充一下settings:


当前访问视图类下------------》全局settings---------》默认default。
但是我们用的是类。

就是.的就是它:

如果我们在全局里边配置了的话,

当然不会去执行默认的,只会识别json文件。
所以再一次强调我们的访问顺序是:
当前访问视图类下------------》全局settings---------》默认default。
DRF之解析器源码解析的更多相关文章
- Python解析器源码加密系列之(二):一次使用标准c的FILE*访问内存块的尝试
摘要:由于近期打算修改Python解释器以实现pyc文件的加密/解密,出于保密的要求,解密之后的数据只能放在内存中,不能写入到文件中.但是后续的解析pyc文件的代码又只能接受FILE*作为入参,所以就 ...
- springMVC 拦截器源码解析
前言:这两天学习了代理模式,自然想到了 springmvc 的 aop 使用的就是动态代理,拦截器使用的就是 jdk 的动态代理.今天看了看源码,记录一下.转载请注明出处:https://www.cn ...
- Django 之 restframework 解析器源码分析
解析器分类: 1. JSONPaser ----> 解析 JSON-serialized data (解析JSON序列化的数据) 2.FormParser ---->解析form 表单中 ...
- RestFramework之序列化器源码解析
一.源码解析之序列化: 1.当视图类进行实例化序列化类做了如下操作: #ModelSerializer继承Serializer再继承BaseSerializer(此类定义实例化方法) #在BaseSe ...
- Struts2 源码分析-----拦截器源码解析 --- ParametersInterceptor
ParametersInterceptor拦截器其主要功能是把ActionContext中的请求参数设置到ValueStack中,如果栈顶是当前Action则把请求参数设置到了Action中,如果栈顶 ...
- 开源项目源码解析-PhotoView 源码解析
1. 功能介绍 特性(Features): 支持 Pinch 手势自由缩放. 支持双击放大/还原. 支持平滑滚动. 在滑动父控件下能够运行良好.(例如:ViewPager) 支持基于 Matrix 变 ...
- 源码解析 || ArrayList源码解析
前言 这篇文章的ArrayList源码是基于jdk1.8版本的源码,如果与前后版本的实现细节出现不一致的地方请自己多加注意.先上一个它的结构图 ArrayList作为一个集合工具,对于我而言它值得我们 ...
- JDK源码解析---HashMap源码解析
HashMap简介 HashMap是基于哈希表实现的,每一个元素是一个key-value对,其内部通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长. HashMap是非线程安全的,只是 ...
- Python解析器源码加密系列之(一):标准c的tmpfile()、tmpfile_s()生成的临时文件究竟放在哪里了?
这两天由于修改python解释器的需求,需要用到tmpfile()来生成临时文件的FILE*,但是又担心这个临时文件是否存在于磁盘的某个地方,终究会被人找到,所以就简单做了以下几点实验,看看是否可以找 ...
随机推荐
- IP地址在mysql的存储(IP地址和int的转换)
PHP echo ip2long('192.168.1.38'); 输出:3232235814 MYSQL SELECT INET_ATON('192.168.1.38'); 输出:323223581 ...
- Android的TextView设置加粗对汉字无效
//not work textView.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD)); //work! static public voi ...
- 真-关闭win10安全中心(windows defender)
狂客原创,转载请注明.侵权必究 第一 任务管理器 启动项 禁用 第二 使用win+R,打开运行命令输入:gpedit.msc然后点击确定 在管理模块下找到Windows组件,接续打开下拉菜单,找到Wi ...
- JS备忘
1. Promise用法 js异步调用较多,如果某个操作是基于上个异步结果才能执行的,再有一个操作又是基于此操作的,则需要嵌套多层代码,在ES6中引入了Promise写法,可以比较优雅的解决这个问题: ...
- 【CF434D】Nanami's Power Plant 最小割
[CF434D]Nanami's Power Plant 题意:有n个二次函数$y=a_ix^2+b_ix+c_i$($a_i,b_i,c_i$是整数),第i个函数要求x的取值在$[l_i,r_i]$ ...
- js post 下载文件
function DownLoadPost(url,data) { if (url && data) { var form = $('<form>{{ xsrf_form_ ...
- Sping boot和mybatis整合
在没有配置数据库时,注释这样@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) 接下来我们DataSourceA ...
- M - 非诚勿扰 优先队列
来源 作为2013年699万应届毕业生中的一员,由于宏观经济的不景气,小明在毕业当天就华丽丽地失业了! 经历了千难万苦的求职过程,小明特别能理解毕业生的就业之难,所以,他现在准备创建一家专门针对IT人 ...
- C++常用的文件操作路径函数
shlwapi.dll中的实用API函数发布 在windows system目录下有这个动态链接库 BOOL PathFileExists(LPCTSTR lpszPath)功能:检查文件/路径 ...
- Java Web 笔试(面试)题
1.Servlet 的生命周期,并说出 Servlet 与 CGI 的区别 Web 容器加载 Servlet 并将其实例化后,Servlet 生命周期开始,容器运行其 init 方法进行 Servle ...