Django项目中的代码如下

  • urls.py中:
from django.conf.urls import url
from app import views urlpatterns = [
url(r'^test/$', views.APIViewSourceCode.as_view()),
]
  • views.py中:
from rest_framework.views import APIView
class APIViewSourceCode(APIView):
def get(self, request):
pass
def post(self, request):
pass

APIView源码解析

1.启动Django项目
2.加载settings.py文件
3.读取models.py文件
4.加载views.py文件
5.加载urls.py文件
6.执行urls.py文件

7.执行views.py文件中的APIViewSourceCode类中的as_view()方法

由于APIViewSourceCode类中没有as_view()方法, 于是去APIViewSourceCode的父类APIView中寻找as_view().

8.点击进入APIView源码:

rest_framework\views.py文件中下的 class APIView(View):

可以看出, APIView源码中的as_view()方法会去执行它父类(View)的as_view方法.

9.点击进入APIView(View)的父类View源码:

View的源码是这样的:

  • 第一部分:

  • 第二部分:

  • 总结: 从View的源码中可以分析出, 执行Viewas_view方法意味着要去执行当前调用对象的dispatch方法.
10.由于当前调用对象是我们自定义的CBV,所以我们去自定义CBV中寻找dispatch方法

很显然, 我们自定义的CBV中没有dispatch方法, 于是我们去APIViewSourceCode的父类APIView中寻找dispatch方法:

可以看出, APIView重写了它的父类Viewdispatch方法, 在APIViewdispatch方法中, 它对最开始自定义CBV的request进行了初始化, 目的是为了给最初的request添加额外的功能. 那么我们现在去initialize_request中看看到底添加了什么额外的功能.

11.点击进入initialize_request

initialize_request最后返回了一个Request对象, 该对象接收了自定义CBV中的request. 我们再来看看这个Request对象进行了什么样的处理.

12.点击进入Request对象中

源码解析总结

弄清楚Django的request对象被添加了什么新功能(属性)


  • request.query_params可以拿到原来URL里面的参数
  • request.data可以拿到前端提交过来的所有数据
  • 等等(待续...)


DRF之APIView源码解析的更多相关文章

  1. CBV源码与APIView源码解析

    一.CBV源码解析 在我们写cbv的时候在url中和fbv的区别就是是否调用了as_view()方法,所以关键入手点就是这个方法 @classonlymethod # 这是类的绑定方法,这个cls是我 ...

  2. DRF之APIView源码简析

    一. 安装djangorestframework 安装的方式有以下三种,注意,模块就叫djangorestframework. 方式一:pip3 install djangorestframework ...

  3. Django APIView源码解析

    APIView使用:luffy项目中关于APIView的使用 在Django之 CBV和FBV中,我们是分析的from django.views import View下的执行流程,以下是代码 fro ...

  4. APIView源码解析

    1.首先安装pip install djangorestframework 2.导入from rest_framework.views import APIView class Courses(API ...

  5. Djang drf:APIView源码分析

    Django REST framework 简介   在序列化与反序列化时,虽然操作的数据不尽相同,但是执行的过程却是相似的,也就是说这部分代码是可以复用简化编写的.        开发REST AP ...

  6. Django生命周期 URL ----> CBV 源码解析-------------- 及rest_framework APIView 源码流程解析

    一.一个请求来到Django 的生命周期   FBV 不讨论 CBV: 请求被代理转发到uwsgi: 开始Django的流程: 首先经过中间件process_request (session等) 然后 ...

  7. CBV源码分析+APIVIew源码分析

    {drf,resful,apiview,序列化组件,视图组件,认证组件,权限组件,频率组件,解析器,分页器,响应器,URL控制器,版本控制} 一.CBV源码分析准备工作: 新建一个Django项目 写 ...

  8. Django rest framework框架——APIview源码分析

    一.什么是rest REST其实是一种组织Web服务的架构,而并不是我们想象的那样是实现Web服务的一种新的技术,更没有要求一定要使用HTTP.其目标是为了创建具有良好扩展性的分布式系统. 可用一句话 ...

  9. DRF-解析器组件源码解析

    解析器组件源码解析 解析器组件源码解析 1 执行request.data 开始找重装的request中的data方法 2 在dispatch找到重装的request def dispatch(self ...

随机推荐

  1. 从程序员之死看 IT 人士如何摆脱低情商诅咒

    (1) IT公司的创业者苏享茂忽然跳楼自杀了,自杀前,他留下几万字的文字记录.遗书,并且在自己开发的软件界面上,设置了弹出页面,控诉是恶毒前妻逼死了自己. 生命戛然而止,留给亲人痛苦,留给世人震惊. ...

  2. RAID 10是将RAID 1和RAID 0结合

    RAID 10是将RAID 1和RAID 0结合,它的优点是同时拥有RAID 0的超凡速度和RAID 1的数据高可靠性,但是CPU占用率同样也更高,而且磁盘的利用率比较低.由于利用了RAID 0极高的 ...

  3. Centos6.5 下安装配置Apache+PHP+Mysql环境

    1.准备工作 # yum -y update && yum -y install vim make cmake gcc gcc-c++ bison bison-devel ncurse ...

  4. BZOJ 4009: [HNOI2015]接水果 (整体二分+扫描线 树状数组)

    整体二分+扫描线 树状数组 具体做法看这里a CODE #include <cctype> #include <cstdio> #include <cstring> ...

  5. 解决CMD控制台乱码问题

    在cmd控制台中出现乱码情况如下 解决方式1 在控制台中输入    CHCP65001 按enter回车键查看 注:CHCP是一个计算机指令,能够显示或设置活动代码页编号. 代码页    描述6500 ...

  6. codeforces316E3

    Summer Homework CodeForces - 316E3 By the age of three Smart Beaver mastered all arithmetic operatio ...

  7. MySQL初识数据库

    为什要用数据库 第一,将文件和程序存在一台机器上是很不合理的. 第二,操作文件是一件很麻烦的事 你可以理解为 数据库 是一个可以在一台机器上独立工作的,并且可以给我们提供高效.便捷的方式对数据进行增删 ...

  8. MIME协议(三) -- MIME邮件的组织结构

    一封MIME邮件可以由多个不同类型的MIME消息组合而成,一个MIME消息表示邮件中的一个基本MIME资源或若干基本MIME消息的组合体.每个MIME消息的数据格式与RFC822数据格式相似,也包括头 ...

  9. elasticsearch-head后台运行

    运行插件 # npm run start > elasticsearch-head@0.0.0 start /usr/local/elasticsearch-head-master > g ...

  10. IDEA项目结构只剩下了pom,而代码都找不到了

    大体效果就是下面这个样子的, 只剩下一个pom文件了. 解决方式: 本来想彻底排查下的,但是最后发现 直接删除.idea文件, 重新引入项目,就可以解决,可能就是编译器发神经吧 下面是排查的过程,不过 ...