在django和rest_framework项目中我们经常可以看到view、APIView、GenericAPIView,在此记录下三者关系
在说之前,先介绍下FBV和CBV
FBV(function base view)
我们经常写的视图函数都是FBV,如:
def index(request):
return HttpResponse()
CBV(class base view)
定义视图类来处理逻辑,如:
from django.views import View
class Index(View):
def get(self, request):
return HttpResponse()
def post(self, request):
return HttpResponse()
CBV相比较FBV有什么好处呢?
1、可以用不同的函数针对不同的HTTP方法处理,而不是通过很多if判断,提高代码可读性;
2、python多继承特性,可以使用面向对象的技术,比如Mixin(多继承),提高了代码的复用性。
View
上述例子中可以看到视图类继承了django的View,这就是我们介绍的View,可以看到,View是django自带的模块,View内部的as_view方法和dispatch方法,实现了http请求可通过不同的http请求方法走到不同的函数中。
APIView
APIView是django rest framework框架中的基类,使用前需要安装dj_rest_framework。APIView继承了django中的View,所以也具有View的特性,相比较View进行了封装,主要内容有:
1、传入到视图方法中的是REST framework的Request对象,而不是Django的HttpRequeset对象;
2、视图方法可以返回REST framework的Response对象,视图会为响应数据设置(render)符合前端要求的格式;
3、任何APIException异常都会被捕获到,并且处理成合适的响应信息;
4、在进行dispatch()分发前,会对请求进行身份认证、权限检查、流量控制。
支持定义的属性:
- authentication_classes 列表或元祖,身份认证类
- permissoin_classes 列表或元祖,权限检查类
- throttle_classes 列表或元祖,流量控制类
GenericAPIView
继承自APIVIew,增加了对于列表视图和详情视图可能用到的通用支持方法。通常使用时,可搭配一个或多个Mixin扩展类。
支持定义的属性:
- queryset 列表视图的查询集
- serializer_class 视图使用的序列化器
GenericAPIView更多的是搭配Mixin扩展类来实现部分功能,我们本章不过多介绍Mixin扩展类。queyset和serializer_class 是后续ViewSet视图集中重要的属性,也需要了解详细。
后面会介绍ViewSet和Mixin扩展类,今天先这样吧。总之不管是APIView还是GenericAPIView,都是为了能让开发者更有效、更方便地开发符合REST规范接口。