Django-REST-framework Views和ViewSets学习
REST-framework作为Django的扩展框架,利用它我们能够快速地开发RESTful接口。
基于类的视图
REST框架提供了一个APIView类,它是Django View类的子类
使用REST-framework框架的Request和Response
传入的请求将被认证,并且在将请求分派给处理程序方法之前将运行适当的permission等检查
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import authentication, permissions
from django.contrib.auth.models import User
class ListUsers(APIView):
authentication_classes = (authentication.TokenAuthentication,)
permission_classes = (permissions.IsAdminUser,)
def get(self, request, format=None):
usernames = [user.username for user in User.objects.all()]
return Response(usernames)
def post(self, request, *args, **kwargs):
...API策略属性
这些属性是执行视图前后进行一些切面操作:
renderer_classes
parser_classes
permission_classes
authentication_classes
content_negotiation_class
dispatch()调度过程
dispatch源码:
调用initialize_request()方法确保传递给处理程序方法的请求对象是一个实例Request,而不是通常的Django HttpRequest。会将策略属性传入进去。
调用initial()方法,会进行一些权限校验等等。
根据请求方法执行相应函数。
handle_exeception()。处理程序方法抛出的任何异常都将传递给此方法,该方法将返回一个Response实例,或者重新引发异常。
执行finalize_response()确保Response从处理程序方法返回的任何对象将被呈现为正确的内容类型,由内容negotiation确定。
基于函数的视图
利用@api_view()装饰器可以开发简单的视图函数:
注:默认情况下,只有GET方法会被接受。其他方法将返回“405 方法不允许”。可以指定允许的方法,如@api_view(['GET', 'POST']) 。
API策略装饰器:
@renderer_classes(...)
@parser_classes(...)
@authentication_classes(...)
@throttle_classes(...)
@permission_classes(...)
通用视图
基于类的视图的关键好处之一是它们允许你构建可重用行为的方式。REST框架通过提供一些预先构建的视图来提供常用的模式,从而充分利用了这一点。
GenericAPIView
这个类扩展了REST框架的APIView类,为标准的列表视图和细节视图添加了通常需要的行为。提供的每个具体通用视图都是通过GenericAPIView与一个或多个mixin类相结合来构建的。
常用属性:
queryset:用于从视图返回对象的查询集
serializer_class:用于验证、序列化输出和反序列化输入的序列化器
filter_backends:用于过滤查询集的过滤器后端类的列表
常用方法:
get_queryset(self):返回应该用于列表视图的查询集,默认返回queryset属性指定的查询集
get_object(self):返回应该用于详细视图的对象实例。默认使用lookup_field参数来过滤基本查询集
filter_queryset(self, queryset):给定一个查询集,使用任何后端正在使用的过滤器,返回一个新的查询集
get_serializer_class(self):返回应该用于序列化程序的类。默认返回serializer_class属性
Mixins
mixin类提供用于提供基本视图行为的操作。
ListModelMixin
提供一个.list(request, *args, **kwargs)实现列出查询集的方法
如果查询集已填充,则返回一个200 OK响应,并将查询集的序列化表示形式作为响应的主体。响应数据可以可选地分页
CreateModelMixin
提供一种.create(request, *args, **kwargs)实现创建和保存新模型实例的方法
如果创建了一个对象,则会返回一个201 Created响应,并将对象的序列化表示形式作为响应的主体。如果该表示包含一个名为的键url,则Location响应的标题将填充该值
RetrieveModelMixin
提供一个.retrieve(request, *args, **kwargs)方法,实现在响应中返回现有的模型实例
UpdateModelMixin
提供一个.update(request, *args, **kwargs)方法,实现更新和保存现有的模型实例
还提供了.partial_update(request, *args, **kwargs)一种与该update方法类似的方法,只是所有更新字段都是可选的
DestroyModelMixin
提供一个.destroy(request, *args, **kwargs)方法,实现现有模型实例的删除
具体视图类
CreateAPIView
用于创建模型实例
提供一个post方法处理
继承:GenericAPIView,CreateModelMixin
ListAPIView
用于读取模型实例的集合
提供一个get方法处理
继承:GenericAPIView,ListModelMixin
RetrieveAPIView
用于读取单个模型实例
提供一个get方法处理
继承:GenericAPIView,RetrieveModelMixin
DestroyAPIView
用于删除单个模型实例
提供一个delete方法处理
继承:GenericAPIView,DestroyModelMixin
UpdateAPIView
用于更新单个模型实例
提供put和patch方法处理
继承:GenericAPIView,UpdateModelMixin
ListCreateAPIView
用于读取、创建模型实例的集合
提供get和post方法处理
继承:GenericAPIView,ListModelMixin,CreateModelMixin
RetrieveUpdateAPIView
用于读取、更新单个模型实例
提供get、put和patch方法处理
继承:GenericAPIView,RetrieveModelMixin,UpdateModelMixin
RetrieveDestroyAPIView
用于读取、删除单个模型实例
提供get和delete方法处理
继承:GenericAPIView,RetrieveModelMixin,DestroyModelMixin
RetrieveUpdateDestroyAPIView
用于读取、更新和删除单个模型实例
提供get、put、patch和delete方法处理
继承:GenericAPIView,RetrieveModelMixin,UpdateModelMixin,DestroyModelMixin
ViewSets
Django-REST-framework允许将一组相关视图的逻辑组合在一个类中,称为一个 ViewSet。ViewSet类是一种基于类的View,不提供像.get()或者.post这样的方法处理程序,而是提供诸如.list()和.create()的操作。
简单视图集
例如:
配置url:
标记额外路由行为
REST-framework包含的默认路由器将为标准的create / retrieve / update / destroy风格操作提供路由,如下所示:
如果需要路由到特别的方法,可以使用@detail_route或@list_route装饰器。
ViewSet基类
GenericViewSet
继承ViewSetMixin和GenericAPIView
提供默认设置的get_object和get_queryset等方法
ModelViewSet
继承CreateModelMixin、RetrieveModelMixin、UpdateModelMixin、DestroyModelMixin、ListModelMixin和GenericViewSet
提供.list(),.retrieve(), .create(),.update(),.partial_update(),和.destroy()操作
ReadOnlyModelViewSet
继承RetrieveModelMixin、ListModelMixin和GenericViewSet
只提供一些只读操作:.retrieve()和.list()
Last updated