前言
因为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类有认证,权限,限流三个方法等等