DRF之APIView源码解析
2021-06-18 22:06
标签:info 添加 父类 models framework 属性 class params self 目录 由于 可以看出, 很显然, 我们自定义的CBV中没有 可以看出, 弄清楚Django的request对象被添加了什么新功能(属性) DRF之APIView源码解析 标签:info 添加 父类 models framework 属性 class params self 原文地址:https://www.cnblogs.com/haitaoli/p/10293444.html
Django项目中的代码如下
from django.conf.urls import url
from app import views
urlpatterns = [
url(r'^test/$', views.APIViewSourceCode.as_view()),
]
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
方法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
对象中源码解析总结
request.query_params
可以拿到原来URL里面的参数request.data
可以拿到前端提交过来的所有数据