DRF的View视图,继承自Django的 View,内部实现了 APIView 和 ViewSetMixin两大类。同时在此基础上进行了扩展,实现了一些通用(Generic)类,混入(Mixin)类等额外功能类,帮助我们用更少的代码实现restful风格的API接口。
下面对我们各类视图做一些说明。
View:
-
目录:django/views/generic/base.py
-
Django原生,请求通过路由之后进入的地方
- 实现了as_view()方法,内部调用dispatch方法转发请求到视图内部的方法。例如默认的 GET请求转发到get方法
- 限定允许的请求方式
- 响应options类型请求的方法
APIView:
- 目录:rest_framework/views.py
- DRF 继承自 Django的 View
- 重写了as_view方法,内部调用自己实现的dispatch initial_request等
- initialize_request内使用Request类,实现了对request的封装,例如我们用到的request.query_params request.data等
- 定义了render_classes、permission_classes、authentication_classes、pagination_classes等
- 实现了权限校验、身份认证、频率控制、返回数据渲染;
- 视图继承自此时,路由使用url("test/", MyView.as_view())。GET类型请求转发到get方法上,不支持自定义请求方式和视图函数的映射
GenericAPIView:
- 目录:rest_framework/generics.py
-
继承自APIView。
-
实现了工具属性和方法
# queryset: 属性,视图内的数据集合 # serializer_class: 属性,序列化器 # lookup_field: 属性,指定字段为pk,也就是常用的如 retrieve 等方法用到的主键值参数 # filter_backends: 属性,搜索配置 # pagination_class: 属性,分页配置 # get_queryset(): 数据集合方法。更推荐使用,比直接使用self.queryset属性,性能更佳 # get_object(): 有lookup_field参数或者lookup_url_kwarg参数,需要获取指定数据对象时,会自动校验权限 # get_serializer(): 获取序列化器的实例 # get_serializer_class(): 获取序列化器类 # get_serializer_context(): 返回序列器上下文。默认有request # filter_queryset(): 方法,查询 # paginator: 属性,分页器实例 # paginate_queryset: 分页之后的queryset # get_paginated_response: 分页后的response
ViewSetMixin:
- 目录:rest_framework/viewsets.py
-
重写了as_view方法,可以在方法内使用actions参数把请求方式和方法名绑定在一起.
# 路由形式1: url("test/", MyViewSet.as_view({"get": "get_my_data"})) # 路由形式2: router = DefaultRouter() router.register("test/", MyViewSet, basename="my_view") -
可以使用router.register()来设置路由
扩展:
- 各种Mixin:混入类,提供额外的创建/删除等功能。需要配合APIView 和 ViewSet。
- 各种 APIView :Mixin配合APIView
- 各种 ViewSet:Mixin配合ViewSet



