一、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的更多相关文章

  1. Django框架 --序列化组件(serializer)

    一 .Django自带序列化组件 Django内置的serializers(把对象序列化成json字符串) from django.core import serializers from djang ...

  2. Django框架rest_framework中APIView的as_view()源码解析、认证、权限、频率控制

    在上篇我们对Django原生View源码进行了局部解析:https://www.cnblogs.com/dongxixi/p/11130976.html 在前后端分离项目中前面我们也提到了各种认证需要 ...

  3. Django框架之DRF 基于mixins来封装的视图

    基础视图 示例环境搭建:新建一个Django项目,连接Mysql数据库,配置路由.视图函数.序列化单独创建py文件 # 配置路由 from django.conf.urls import url fr ...

  4. Django框架之DRF get post put delete 使用简单示例 (利用序列化反序列化)

    路由配置 # 路由 from django.conf.urls import url from django.contrib import admin from app01 import views ...

  5. Django框架之DRF 认证组件源码分析、权限组件源码分析、频率组件源码分析

    认证组件 权限组件 频率组件

  6. django框架-DRF视图中的request和response

    1.Request 相对于django框架,DRF工程的request类则是继承自HttpRequest类,Rest framework提供了parser解释器,用来解释请求中的content_typ ...

  7. Django框架深入了解_01(Django请求生命周期、开发模式、cbv源码分析、restful规范、跨域、drf的安装及源码初识)

    一.Django请求生命周期: 前端发出请求到后端,通过Django处理.响应返回给前端相关结果的过程 先进入实现了wsgi协议的web服务器--->进入django中间件--->路由f分 ...

  8. DRF框架之使用Django框架完成后端接口(API)的定义

    学习DRF框架,首先我们就需要明白为什么要学习这个框架. 接下来我们就先用原生的Django框架来定义一个符合RESTful设计方法的接口(API). RESTful接口的需求如下: GET /boo ...

  9. 框架----Django框架知识点整理

    一.cbv cbv(class-base-view) 基于类的视图 fbv(func-base-view) 基于函数的视图 a.基本演示 urlpatterns = [ url(r'^login.ht ...

随机推荐

  1. Scrapy爬虫案例 | 数据存储至MongoDB

    豆瓣电影TOP 250网址 要求: 1.爬取豆瓣top 250电影名字.演员列表.评分和简介 2.设置随机UserAgent和Proxy 3.爬取到的数据保存到MongoDB数据库  items.py ...

  2. BZOJ 4816[SDOI2017]数字表格(莫比乌斯反演)

    题目链接 \(Description\) 用\(f_i\)表示\(fibonacci\)数列第\(i\)项,求\(\prod_{i=1}^{n}\prod_{j=1}^{m}f[gcd(i,j)]\) ...

  3. OpenVSwitch

    参考: https://opengers.github.io/openstack/openstack-base-use-openvswitch/ 这篇原理部分就不贴出来了,请自行参考上文,并根据自行实 ...

  4. nginx之系统参数优化

    系统参数优化 默认的Linux内核参数考虑的是最通用场景,不符合用于支持高并发访问的Web服务器的定义,根据业务特点来进行调整,当Nginx作为静态web内容服务器.反向代理或者提供压缩服务器的服务器 ...

  5. Navicat自动断开连接处理方式

    问题描述 使用Navicat连接mysql后,如果一段时间不操作,那么会再次操作时会提示无响应,每次都这样确实折磨人,大大降低了工作效率! 问题解决 关闭连接→右键连接→连接属性 将上述心跳时间设置为 ...

  6. jmeter-可视化的非GUI模式

    概述 我们在使用JMeter执行性能测试的过程中,会遇到很多不方便的地方 GUI模式 执行脚本很方便,看结果也很方便,但是GUI模式消耗资源,对测试结果的准确性影响很大 非GUI模式 消耗资源很少,但 ...

  7. IO多路复用之select poll epoll

    参考文档: http://blog.csdn.net/tennysonsky/article/details/45745887 select(),poll(),epoll()都是I/O多路复用的机制. ...

  8. 数据结构之LinkList

    1.结构: 2.Link代码: public class Link { public int iData; public double dData; public Link next; public ...

  9. html在div中显示滚动条

    基本思路:滚动条要添加到内容部分的父标签上(div),内容部分不设置大小,父标签要明确设置大小,并且父标签要添加overflow样式,并设置成auto. 打开的效果如下: 这时可能有人会问,父div的 ...

  10. sqlserver cdc用法

    SELECT top(10)  * from (SELECT  sys.fn_cdc_map_lsn_to_time([__$start_lsn])  'addtime',* FROM cdc.dbo ...