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. Rendering in UE4(Gnomon School UE4 大师课笔记)

    Rendering in UE4 Presented at the Gnomon School of VFX in January 2018, part two of the class offers ...

  2. 牛客国庆集训派对Day6 && CCPC-WannaFly-Camp #1 F. kingdom(DP)

    题目链接:https://www.nowcoder.com/acm/contest/206/F 题意:一棵 n 个点的树,根为 1,重儿子到父亲的费用为 0,其余为 1,问所有点到 1 的最大总费用是 ...

  3. QT 设置应用程序图标和可执行程序图标

    1, 首先准备个ICO图标.例如:myappico.ico 在工程目录下新建images文件夹并你的图标myappico.ico(只能用ico格式的图片)放到工程目录下的images文件夹下 2, 用 ...

  4. mysql优化之SQL优化

    https://www.cnblogs.com/binghou/p/9096610.html (SQL优化)

  5. Noip2016 提高组 Day2 T1 组合数问题

    题目描述 组合数表示的是从n个物品中选出m个物品的方案数.举个例子,从(1,2,3) 三个物品中选择两个物品可以有(1,2),(1,3),(2,3)这三种选择方法.根据组合数的定 义,我们可以给出计算 ...

  6. 【线性代数】2-2:消元(Eliminate)

    title: [线性代数]2-2:消元(Eliminate) toc: true categories: Mathematic Linear Algebra date: 2017-08-31 16:1 ...

  7. Rapid Object Detection using a Boosted Cascade of Simple Features 部分翻译

    Rapid ObjectDetection using a Boosted Cascade of Simple Features 使用简单特征级联分类器的快速目标检测 注:部分翻译不准处以红色字体给出 ...

  8. ew做代理 进一步内网渗透

    0x00 前言 最近搞站的时候有内网穿透的需求,大佬向我推荐了EW,本文模拟一个攻击场景对Earthworm的使用方法做一个简单的介绍.其实相应的内容EW的官网已经说得很详细了,我这里纯粹是作为个人笔 ...

  9. java线程基础方法详解

    一.线程状态转换 1.新建状态(New):新创建了一个线程对象. 2.就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法.该状态的线程位于可运行线程池中,变得可运行 ...

  10. Leetcode题目155.最小栈(简单)

    题目描述: 设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈. push(x) -- 将元素 x 推入栈中.pop() -- 删除栈顶的元素.top() -- 获取栈顶 ...