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源码:

  1. 调用initialize_request()方法确保传递给处理程序方法的请求对象是一个实例Request,而不是通常的Django HttpRequest。会将策略属性传入进去。

  1. 调用initial()方法,会进行一些权限校验等等。

  1. 根据请求方法执行相应函数。

  1. handle_exeception()。处理程序方法抛出的任何异常都将传递给此方法,该方法将返回一个Response实例,或者重新引发异常。

  2. 执行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基类

  1. GenericViewSet

  • 继承ViewSetMixin和GenericAPIView

  • 提供默认设置的get_object和get_queryset等方法

  1. ModelViewSet

  • 继承CreateModelMixin、RetrieveModelMixin、UpdateModelMixin、DestroyModelMixin、ListModelMixin和GenericViewSet

  • 提供.list(),.retrieve(), .create(),.update(),.partial_update(),和.destroy()操作

  1. ReadOnlyModelViewSet

  • 继承RetrieveModelMixin、ListModelMixin和GenericViewSet

  • 只提供一些只读操作:.retrieve()和.list()


Home - Django REST framework

Last updated