drf视图
DRF类视图介绍
在DRF框架中提供了众多的通用视图基类与扩展类,以简化视图的编写。
-
View:Django默认的视图基类,负责将视图连接到URL,HTTP请求方法的基本调度, 之前写类视图一般都用这个。
-
APIView:DRF提供的所有视图的基类,继承View并扩展,具备了身份认证、权限检查、 流量控制等功能。
-
GenericAPIView:对APIView更高层次的封装,例如增加分页、过滤器
-
GenericViewSet:继承GenericAPIView和ViewSet
-
ViewSet:继承APIView,并结合router自动映射路由
-
ModelViewSet:继承GenericAPIView和五个扩展类,封装好各种请求,更加完善, 业务逻辑基本不用自己写了。
APIView类
APIView:DRF提供的所有视图的基类,继承View并扩展,具备了身份认证、权限检查、 流量控制等功能。
Request与Response
DRF传入视图的request对象不再是Django默认的HttpRequest对象,而是基于 HttpRequest类扩展后的Request类的对象。
Request对象的数据是自动根据前端发送的数据统一解析数据格式。
常用属性:
-
request.data:返回POST提交的数据,与request.POST类似
-
request.query_params:返回GET URL参数,与request.GET类似
DRF提供了一个响应类Reponse,响应的数据会自动转换符合前端的JSON数据格式。
导入:
from rest_framework.response import Response |
格式:
Response(data, status=None, template_name=None, headers=None, content_type=None)
-
data:响应序列化处理后的数据,传递python对象
-
status:状态码,默认200
-
template_name:模板名称
-
headers:用于响应头信息的字典
-
content_type:响应数据的类型
使用方法:return Reponse(data=data, status=status.HTTP_404_NOT_FOUND)
为了方便设置状态码,rest_framework.status模块提供了所有HTTP状态码,以下是一些 常用的:
-
HTTP_200_OK:请求成功
-
HTTP_301_MOVED_PERMANENTLY:永久重定向
-
HTTP_302_FOUND:临时重定向
-
HTTP_304_NOT_MODIFIED:请求的资源未修改
-
HTTP_403_FORBIDDEN:没有权限访问
-
HTTP_404_NOT_FOUND:页面没有发现
-
HTTP_500_INTERNAL_SERVER_ERROR:服务器内部错误
-
HTTP_502_BAD_GATEWAY:网关错误
-
HTTP_503_SERVICE_UNAVAILABLE:服务器不可达
-
HTTP_504_GATEWAY_TIMEOUT:网关超时
GenericAPIView类
GenericAPIView对APIView更高层次的封装,实现以下功能:
-
增加queryset属性,指定操作的数据,不用再将数据传给序列化器,会自动实现。
-
增加serializer_class属性,直接指定使用的序列化器
-
增加过滤器属性:filter_backends • 增加分页属性:pagination_class
-
增加lookup_field属性和实现get_object()方法:用于获取单条数据,可自定义默认分组名(pk)
ViewSet类
GenericAPIView已经完成了许多功能,但会有一个问题,获取所有用户列表和单个用户需 要分别定义两个视图和URL路由,使用ViewSet可以很好解决这个问题,并且实现了路由自 动映射。
ViewSet视图集不再实现get()、post()等方法,而是实现以下请求方法动作:
-
list():获取所有数据
-
retrieve():获取单个数据
-
create():创建数据
-
update():更新数据
-
destory():删除数据
在路由这块定义与之前方式一样,每个API接口都要写一条URL路由,但实际上我们用ViewSet 后,就不用自己设计URL路由及绑定HTTP方法了,会自动处理URL路由映射。
然后访问http://ip/myapp_api/api 就可以看到自动生成的URL路由。
ModelViewSet类
ModelViewSet继承GenericAPIView和五个扩展类,封装好各种请求,更加完善,业务逻 辑基本不用自己写了,只需要指定serializer_class和queryset,就可以直接进行增删改查。
由于ModelViewSet有较高的抽象,实现自动增删改查功能。对于增、改在很多场景无法 满足需求,这就需要重写对应方法了。