源码分析Django rest_framework中的APIView类的执行过程以及与View类的区别

前言

因为APIView是继承View,所以如果时间足够可以点击去CBV的执行流程,对本文理解有好处,可以打开项目复制代码,跟着本文一步一步分析,加快理解,如果想要快速了解APIView,可以直接跳到总结

一、APIView是什么?

APIView是Django REST framework中的一个类,用于处理HTTP请求并返回HTTP响应。APIView提供了一种基于类的视图的方式,可以更方便地编写RESTful API。APIView可以处理GET、POST、PUT、DELETE等HTTP请求,并根据请求的类型调用对应的方法,如get()、post()、put()、delete()等。通过APIView,开发者可以更加灵活地定义API的行为和逻辑。

二、源码分析

1.示例代码

Views.py:

from django.shortcuts import render, HttpResponse
from django.views import View
from rest_framework.views import APIView
class DateCBVViews(APIView):
    def get(self,request,*args,**kwargs):
        return HttpResponse("CBV_GET方法")
    def post(self,request,*args,**kwargs):
        return HttpResponse("CBV_POST方法")

urls.py:

from django.urls import path,re_path
from api import views
urlpatterns = [
    path('api/cbv/',views.DateCBVViews.as_view()),]

 api是我项目代码的名称,根据自己情况去改

2.代码分析

CTRL+鼠标左键点击urls.py中路由中的as_view()方法

进来之后我们可知APIView是继承View类的

下滑找到

这里代码最重要的就是这一行代码,super()方法的意思就是调用父类的as_view方法,而APIView是继承View类的,所以是View类的as_view方法,我们CTRL+鼠标左键点击as_view进入


下滑找到这个方法的最后,然后发现返回的是view方法,CTRL+鼠标左键点击view

点击后发现,调用的是as_view()方法中写的view方法,在这代码中最重要的就是dispatch方法其他不重要,下滑找到dispatch方法

继续点击进入View类查看View类里面这个dispatch方法

继续退到刚开始进入的APIView类,下滑也找到APIView类中的dispatch方法

仔细观察发现APIView类中的dispatch方法,包括了View类中的dispatch方法,主要是多了两个方面的内容,所以我们等下分析以下三个内容

重点来了,最重要的就是这三个方面的代码

首先先分析APIView类中的dispatch方法和View类中的dispatch方法共有的代码

request.method.lower()就是把请求方式改成小写(例如get请求方式),request.method就是请求方式,lower()就是改成小写

http_method_names我们可以点击进去查看一下

getattr() 函数在Python中用于从对象中获取指定属性的值。

它的语法是:

getattr(对象, 属性, 默认值)

        对象 是要从中获取属性值的对象。
        属性 是要获取其值的属性的名称。
        默认值(可选)是在属性不存在时要返回的值(如果不提供,则会引发 AttributeError)。


所以这里代码的意思就是if判读 request.method.lower() 请求的方法在 self.http_method_names:里面的话,就执行 getattr方法,self就是我们一开始定义的DateCBVViews类对象,所以这里的

handler =getattr( self, request.method.lower(), self.http_method_not_allowed )

的意思就是(注意:假设这里请求的是get方式):把DateCBVViews.get(注意:不存在就会执行self.http_method_not_allowed 方法)赋值给handler,最后通过

return handler(request, *args, **kwargs)

返回并且执行DateCBVViews.get方法

(注意:刚开始赋值给handler的时候并没有执行.get方法,是最后return handler(request, *args, **kwargs)相当于DateCBVViews.get+()加了个括号才算是执行的这个方法)

然后我们再分析第二处代码代码

这个代码的意思就是重新定义request,CTRL+鼠标左键点击request查看

重点:返回一个Request对象,这里面我们可以看到,除了本来的request还增加的一些其他方面的功能,所以APIView的request比View的request一个主要的区别就在这里,这里我不仔细分析了,我来举个例子,

比如:前后分离的项目,前后端数据的传送主要是用JSON格式,而View的request.post无法解析JSON格式,但是APIView的request.post可以解析

最后我们再分析第三处代码

request,CTRL+鼠标左键点击initial查看

这个里面主要是写了这三个功能,也是APIViem非常重要的三个功能,分别是认证,权限,限流

(这里我也不仔细分析了,如果想要了解这三个功能,私信或再下方评论,到时候我会再写更新一篇有关方面的内容)


总结

APiView的执行流程就是:

APiView as_view ==> View as_view.view ==>APiView dispatch() ==>执行请求的方式(例如get)

APIView和View的关系:

1.APIView类继承View类

2.APIView的request比View的request有更多的一些功能

3.APIView类有认证,权限,限流三个方法等等

  • 22
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值