Django框架之DRF APIView Serializer
一、APIView
我们在使用DjangoRestfulFramework的时候会将每个视图类继承APIView,取代原生Django的View类
APIView的流程分析:
rest_framework>>views.py>>APIView

进入APIView
APIView>>as_view
走as_view方法(此方法会在Django启动时,在路由文件内执行,最终返回一个view函数内存地址)


接下来我们回顾一下Django原生的as_view内的view方法内容:

或者通过代码点进去View,找到原生as_view:
from django.views import View

APIView>>dispatch
根据图片分析,最终会走到APIView中的dispatch方法,我们找到它:


关键代码:initialize_request

找到initialize_request(APIView内)

关键代码:initial

找到initial(APIView内)

接下来小结一下APIView大致流程:
APIView内的as_view>>原生Django的as_view方法,返回view函数内存地址,然后继续在APIView的as_view中返回这个view内存地址,同时这个view被装饰了一个禁用csrf的一个装饰器>>在成功匹配到路由进入视图函数时候,就会走view()执行,view会返回dispatch(),走APIView的dispatch方法>>在dispatch方法内通过Request类的封装,将原生Django的request对象封装到Request类中,实例化的request对象就是drf产生的新的request,同时还封装了3个重要的校验方法:权限、认证、频率>>最后dispatch方法根据getattr反射得到请求方式对应的我们写的类中的请求方法(比如请求是get就走get函数方法,是post就走post函数方法),然后对请求进行处理、响应。
这里补充几个源码的处理细节:
APIView>>request对象
它是drf的Request类的对象


APIView>>request对象>>query_params

继续挖掘:
Django原生的request对象
我们在一个视图类中打印一下type(request._request)




GET方法:


GET方法小结:
Django原生request里面有个GET(以get形式提交的数据),提交get数据时都拆到environ内部,Django把数据取出来转成了QueryDict的对象
引伸:session不是原生request对象的属性,它是在中间件中放进去的('django.contrib.sessions.middleware.SessionMiddleware')
DRF的Request类:
__getattr__方法重写:

二、Serializer序列化
校验源码:is_valid()
首先需要知道,什么时候会走is_valid:调用了对象.is_valid()时,会对反序列化的对象进行校验

进入is_valid源码:


注意我们是在BaseSerializer中找到的is_valid的

注意这里走run_validation时候,传入了initial_data,这个initial_data在BaseSerializer的__init__中有,
那么,需要分析一下:__init__在什么时候会触发,于是找BaseSerializer的子类发现都没有__init__,所以推出在视图类中反序列化得到对象的时候就触发了__init__,然后紧接着就进行了is_valid的校验

接下来继续进入run_validation:这里不要直接点了,直接点肯定是想上找,这里得从Serializer找,发现还真有:



Django框架之DRF APIView Serializer的更多相关文章
- Django框架 --序列化组件(serializer)
一 .Django自带序列化组件 Django内置的serializers(把对象序列化成json字符串) from django.core import serializers from djang ...
- Django框架rest_framework中APIView的as_view()源码解析、认证、权限、频率控制
在上篇我们对Django原生View源码进行了局部解析:https://www.cnblogs.com/dongxixi/p/11130976.html 在前后端分离项目中前面我们也提到了各种认证需要 ...
- Django框架之DRF 基于mixins来封装的视图
基础视图 示例环境搭建:新建一个Django项目,连接Mysql数据库,配置路由.视图函数.序列化单独创建py文件 # 配置路由 from django.conf.urls import url fr ...
- Django框架之DRF get post put delete 使用简单示例 (利用序列化反序列化)
路由配置 # 路由 from django.conf.urls import url from django.contrib import admin from app01 import views ...
- Django框架之DRF 认证组件源码分析、权限组件源码分析、频率组件源码分析
认证组件 权限组件 频率组件
- django框架-DRF视图中的request和response
1.Request 相对于django框架,DRF工程的request类则是继承自HttpRequest类,Rest framework提供了parser解释器,用来解释请求中的content_typ ...
- Django框架深入了解_01(Django请求生命周期、开发模式、cbv源码分析、restful规范、跨域、drf的安装及源码初识)
一.Django请求生命周期: 前端发出请求到后端,通过Django处理.响应返回给前端相关结果的过程 先进入实现了wsgi协议的web服务器--->进入django中间件--->路由f分 ...
- DRF框架之使用Django框架完成后端接口(API)的定义
学习DRF框架,首先我们就需要明白为什么要学习这个框架. 接下来我们就先用原生的Django框架来定义一个符合RESTful设计方法的接口(API). RESTful接口的需求如下: GET /boo ...
- 框架----Django框架知识点整理
一.cbv cbv(class-base-view) 基于类的视图 fbv(func-base-view) 基于函数的视图 a.基本演示 urlpatterns = [ url(r'^login.ht ...
随机推荐
- JS函数基础
一.函数 1.函数是什么 具有特定功能的n条语句的封装体. 只有函数是可执行的,其它类型的数据是不可执行的. 函数也是对象. 2.为什么要用函数 提高代码复用 便于阅读和交流 3.如何定义函数 函数声 ...
- 1.创建SpringMVC项目
1.搭建环境 在Configure下点击Settings 找到Maven修改配置目的是使用自己配置的Maven以及阿里云镜像 开始创建项目 写入自己的公司名,项目名点击下一步 添加信息加快maven配 ...
- [RN] React Native 仿美团下拉筛选菜单控件
React Native 仿美团下拉筛选菜单控件 演示效果如下: 使用方法如下: 1.安装 npm install react-native-dropdownmenus --save react-na ...
- cf1191 解题报告
cf1191 解题报告 A-简单模拟 脑内算出来让计算机输出 #include <bits/stdc++.h> #define ll long long using namespace s ...
- 2018传智黑马Python人工智能视频教程(基础+就业+面试)
2018传智黑马Python人工智能视频教程(基础+就业+面试) 2018传智黑马Python人工智能视频教程(基础+就业+面试) 2018传智黑马Python人工智能视频教程(基础+就业+面试) 下 ...
- bzoj5461 Minimax 题解
https://www.lydsy.com/JudgeOnline/problem.php?id=5461 看到题目,必将m种权值离散化. 首先是一个显然的dp设计. 设$f(i,j)$表示第i个节点 ...
- .NET Core 代码安装服务启动
最近做了一些.NET Core的程序,有在Windows下运行的 有在CentOS 下运行的,Windows下运行的还好,对Windows下还算比较熟悉了,但CentOS 下 每次都是找笔记支持命令 ...
- java 注解,动态代理
秒懂,Java 注解 (Annotation)你可以这样学 深入理解Java注解类型(@Annotation) 注解可以理解为标签. 当开发者使用了Annotation 修饰了类.方法.Field 等 ...
- Django实现自动发布(2视图-服务管理)
通常页面要能对资源进行增删改查,对应http的 POST.DELETE.UPDATE.GET 页面显示使用了layui,而layui的表格有自己的数据获取方式,所以我们的视图要做一些调整,不使用后端渲 ...
- linux命令(55):环境变量:LIBRARY_PATH 和 LD_LIBRARY_PATH的区别
添加环境变量:https://www.cnblogs.com/lovychen/p/5583703.html PATH是可执行文件的环境变量. LIBRARY_PATH 和 LD_LIBRARY_PA ...