DRF之APIView源码解析
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
的源码中可以分析出, 执行View
的as_view
方法意味着要去执行当前调用对象的dispatch
方法.
10.由于当前调用对象是我们自定义的CBV,所以我们去自定义CBV中寻找dispatch
方法
很显然, 我们自定义的CBV中没有dispatch
方法, 于是我们去APIViewSourceCode
的父类APIView
中寻找dispatch
方法:
可以看出, APIView
重写了它的父类View
的dispatch
方法, 在APIView
的dispatch
方法中, 它对最开始自定义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源码解析的更多相关文章
- CBV源码与APIView源码解析
一.CBV源码解析 在我们写cbv的时候在url中和fbv的区别就是是否调用了as_view()方法,所以关键入手点就是这个方法 @classonlymethod # 这是类的绑定方法,这个cls是我 ...
- DRF之APIView源码简析
一. 安装djangorestframework 安装的方式有以下三种,注意,模块就叫djangorestframework. 方式一:pip3 install djangorestframework ...
- Django APIView源码解析
APIView使用:luffy项目中关于APIView的使用 在Django之 CBV和FBV中,我们是分析的from django.views import View下的执行流程,以下是代码 fro ...
- APIView源码解析
1.首先安装pip install djangorestframework 2.导入from rest_framework.views import APIView class Courses(API ...
- Djang drf:APIView源码分析
Django REST framework 简介 在序列化与反序列化时,虽然操作的数据不尽相同,但是执行的过程却是相似的,也就是说这部分代码是可以复用简化编写的. 开发REST AP ...
- Django生命周期 URL ----> CBV 源码解析-------------- 及rest_framework APIView 源码流程解析
一.一个请求来到Django 的生命周期 FBV 不讨论 CBV: 请求被代理转发到uwsgi: 开始Django的流程: 首先经过中间件process_request (session等) 然后 ...
- CBV源码分析+APIVIew源码分析
{drf,resful,apiview,序列化组件,视图组件,认证组件,权限组件,频率组件,解析器,分页器,响应器,URL控制器,版本控制} 一.CBV源码分析准备工作: 新建一个Django项目 写 ...
- Django rest framework框架——APIview源码分析
一.什么是rest REST其实是一种组织Web服务的架构,而并不是我们想象的那样是实现Web服务的一种新的技术,更没有要求一定要使用HTTP.其目标是为了创建具有良好扩展性的分布式系统. 可用一句话 ...
- DRF-解析器组件源码解析
解析器组件源码解析 解析器组件源码解析 1 执行request.data 开始找重装的request中的data方法 2 在dispatch找到重装的request def dispatch(self ...
随机推荐
- (转)VMware虚拟机三种网络模式的区别及配置方法;
我的一点实际经验理解桥接和NAT 桥接是虚拟机完全作为一个独立的地址接在局域网中,NAT是虚拟机依赖宿主主机地址转换的一种方式 例子我的虚拟机如果用桥接模式,连接外部网站如百度时会提示此pc没有装公司 ...
- 不同显卡对mrt 的支持
ios bits限制大概512bits 低端256bits mali 也是bits限制 2017年 Mali-T760 128bits adreno android显卡4 肯定可以 因为deferre ...
- java.lang.NoClassDefFoundError: javax/servlet/ServletOutputStream
扩展阅读:https://blog.csdn.net/kimylrong/article/details/50353161
- Xftp6 和 Xshell 6 下载与安装使用
官网地址:https://www.netsarang.com/zh/all-downloads/ 然后进行安装吧,基本没有什么配置. 打开 xftp 连接 Linux,进行文件操作. 然后 名称:随意 ...
- struts2之登陆拦截
针对登录拦截功能,我们需要设置拦截哪些方法和不拦截哪些方法 action action类中,处理登录时,将用户.密码绑定到session ActionContext ac = ActionContex ...
- HDU 6046 - hash | 2017 Multi-University Training Contest 2
思路来自题解和一些博客 最麻烦的是样例没啥用- - /* HDU 6046 - hash [ hash,鸽巢 ] | 2017 Multi-University Training Contest 2 ...
- 部署openstack
磁盘扩容 lsblk 设置环境语言 export LANG=en_US 扩容块设备 growpart /dev/vda 1 扩容文件系统 xfs_growfs / 配置Ip 配置eth0为公共网络 ...
- 51 Nod 1449 砝码称重
1449 砝码称重 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 收藏 关注 现在有好多种砝码,他们的重量是 w0,w1, ...
- MySQL字段命名不能使用的MySQL关键字
#今天遇到一个问题,把某一字段重新命名为condition时报错,于是联想到可能是MySQL的关键字,用``引起来后,问题解决. #在MySQL数据库中,Table字段不能使用MySQL关键字: #[ ...
- 【平台中间件】为什么用etcd而不用ZooKeeper?从应用场景到实现原理的全方位解读
前言 博主在工作过程中经常接触到ETCD,搜索相关资料的时候发现排名最高的是一篇图片全是404的转载文章,后来看到了原文,感觉有义务让更多的人看到这样的精品文章,所以进行了转载. 原文发布在infoQ ...