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文件

1464512-20190119220042950-1435410057.png

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

1464512-20190119220053786-1621951247.png

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

8.点击进入APIView源码:

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

1464512-20190119220106771-1426470897.png

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

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

1464512-20190119220123479-1131837422.png

View的源码是这样的:

  • 第一部分:

1464512-20190119220133539-747899663.png

  • 第二部分:

1464512-20190119220143313-1738465959.png

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

1464512-20190119220155310-1559018933.png

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

1464512-20190119220205515-1798722552.png

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

11.点击进入initialize_request

1464512-20190119220216314-1355419873.png

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

12.点击进入Request对象中

1464512-20190119220226294-2064192067.png

1464512-20190119220235274-1713707471.png

源码解析总结

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

1464512-20190119220244986-834665986.png


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


转载于:https://www.cnblogs.com/haitaoli/p/10293444.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值