1. [
  1. 课程介绍
  2. ](_index_)
    1. [
  1. 引入DjangoRESTframework
  2. ](c01-introducetodrf_index)
  3. -
  4. [
  5. Web应用模式
  6. ](c01-introducetodrf_separatedfrontendandbackend)
    1. [
  1. 认识RESTful
  2. ](c01-introducetodrf_introducetorest)
    1. [
  1. RESTful设计方法
  2. ](c01-introducetodrf_howtodesignrest)
    1. [
  1. 使用Django开发REST接口
  2. ](c01-introducetodrf_developrestapiwithdjango)
    1. [
  1. 明确REST接口开发的核心任务
  2. ](c01-introducetodrf_coretasktodeveloprestapi)
    1. [
  1. DjangoRESTframework简介
  2. ](c01-introducetodrf_aboutdrf)
    1. [
  1. DRF工程搭建
  2. ](c02-drfproject_index)
  3. -
  4. [
  5. 环境安装与配置
  6. ](c02-drfproject_installandconfig)
    1. [
  1. 见识DRF的魅力
  2. ](c02-drfproject_thefirstdrfprogram)
    1. [
  1. Serializer序列化器
  2. ](c03-serializer_index)
  3. -
  4. [
  5. 定义Serializer
  6. ](c03-serializer_declaring)
    1. [
  1. 序列化使用
  2. ](c03-serializer_serializing)
    1. [
  1. 反序列化使用
  2. ](c03-serializer_deserializing)
    1. [
  1. 模型类序列化器ModelSerializer
  2. ](c03-serializer_modelserializer)
    1. [
  1. 视图
  2. ](c04-view_index)
  3. -
  4. [
  5. RequestResponse
  6. ](c04-view_requestandresponse)
    1. [
  1. 视图概览
  2. ](c04-view_view)
    1. [
  1. 视图说明
  2. ](c04-view_viewintroduction)
    1. [
  1. 视图集ViewSet
  2. ](c04-view_viewset)
    1. [
  1. 路由Router
  2. ](c04-view_routers)
    1. [
  1. 其他功能
  2. ](c05-components_index)
  3. -
  4. [
  5. 认证
  6. ](c05-components_authentication)
    1. [
  1. 权限
  2. ](c05-components_permissions)
    1. [
  1. 限流
  2. ](c05-components_throttling)
    1. [
  1. 过滤
  2. ](c05-components_filtering)
    1. [
  1. 排序
  2. ](c05-components_ordering)
    1. [
  1. 分页
  2. ](c05-components_pagination)
    1. [
  1. 版本
  2. ](c05-components_versioning)
    1. [
  1. 异常处理
  2. ](c05-components_exceptions)
    1. [
  1. 自动生成接口文档
  2. ](c05-components_documents)
    1. [
    2. Published with GitBook
    3. ](https://www.gitbook.com)

课程介绍

视图说明

1. 两个基类

1)APIView

rest_framework.views.APIView
APIView是REST framework提供的所有视图的基类,继承自Django的View父类。
APIViewView的不同之处在于:

  • 传入到视图方法中的是REST framework的Request对象,而不是Django的HttpRequeset对象;
  • 视图方法可以返回REST framework的Response对象,视图会为响应数据设置(render)符合前端要求的格式;
  • 任何APIException异常都会被捕获到,并且处理成合适的响应信息;
  • 在进行dispatch()分发前,会对请求进行身份认证、权限检查、流量控制。

    支持定义的属性:
  • authentication_classes 列表或元祖,身份认证类

  • permissoin_classes 列表或元祖,权限检查类
  • throttle_classes 列表或元祖,流量控制类

APIView中仍以常规的类视图定义方法来实现get() 、post() 或者其他请求方式的方法。
举例:

  1. from rest_framework.views import APIView
  2. from rest_framework.response import Response
  3. # url(r'^books/$', views.BookListView.as_view()),
  4. class BookListView(APIView):
  5. def get(self, request):
  6. books = BookInfo.objects.all()
  7. serializer = BookInfoSerializer(books, many=True)
  8. return Response(serializer.data)

2)GenericAPIView

rest_framework.generics.GenericAPIView
继承自APIVIew主要增加了操作序列化器和数据库查询的方法,作用是为下面Mixin扩展类的执行提供方法支持。通常在使用时,可搭配一个或多个Mixin扩展类。

提供的关于序列化器使用的属性与方法

  • 属性:

  • serializer_class 指明视图使用的序列化器

  • 方法:

  • get_serializer_class(self)

    返回序列化器类,默认返回serializer_class,可以重写,例如:

  1. def get_serializer_class(self):
  2. if self.request.user.is_staff:
  3. return FullAccountSerializer
  4. return BasicAccountSerializer
  • get_serializer(self, _args, *_kwargs)

返回序列化器对象,主要用来提供给Mixin扩展类使用,如果我们在视图中想要获取序列化器对象,也可以直接调用此方法。
注意,该方法在提供序列化器对象的时候,会向序列化器对象的context属性补充三个数据:request、format、view,这三个数据对象可以在定义序列化器时使用。

  • request 当前视图的请求对象
  • view 当前请求的类视图对象
  • format 当前请求期望返回的数据格式

提供的关于数据库查询的属性与方法

  • 属性:

  • queryset 指明使用的数据查询集

  • 方法:

  • get_queryset(self)
    返回视图使用的查询集,主要用来提供给Mixin扩展类使用,是列表视图与详情视图获取数据的基础,默认返回queryset属性,可以重写,例如:

  1. def get_queryset(self):
  2. user = self.request.user
  3. return user.accounts.all()
  • get_object(self)
    返回详情视图所需的模型类数据对象,主要用来提供给Mixin扩展类使用。
    在试图中可以调用该方法获取详情信息的模型类对象。
    若详情访问的模型类对象不存在,会返回404。
    该方法会默认使用APIView提供的check_object_permissions方法检查当前对象是否有权限被访问。
    举例:
  1. # url(r'^books/(?P<pk>\d+)/$', views.BookDetailView.as_view()),
  2. class BookDetailView(GenericAPIView):
  3. queryset = BookInfo.objects.all()
  4. serializer_class = BookInfoSerializer
  5. def get(self, request, pk):
  6. book = self.get_object() # get_object()方法根据pk参数查找queryset中的数据对象
  7. serializer = self.get_serializer(book)
  8. return Response(serializer.data)

其他可以设置的属性

  • pagination_class 指明分页控制类
  • filter_backends 指明过滤控制后端

    2. 五个扩展类

    作用:

    提供了几种后端视图(对数据资源进行曾删改查)处理流程的实现,如果需要编写的视图属于这五种,则视图可以通过继承相应的扩展类来复用代码,减少自己编写的代码量。
    这五个扩展类需要搭配GenericAPIView父类,因为五个扩展类的实现需要调用GenericAPIView提供的序列化器与数据库查询的方法。

    1)ListModelMixin

    列表视图扩展类,提供list(request, *args, **kwargs)方法快速实现列表视图,返回200状态码。
    该Mixin的list方法会对数据进行过滤和分页。
    源代码: ``` class ListModelMixin(object): “”” List a queryset. “”” def list(self, request, args, *kwargs):
    1. # 过滤
    2. queryset = self.filter_queryset(self.get_queryset())
    3. # 分页
    4. page = self.paginate_queryset(queryset)
    5. if page is not None:
    6. serializer = self.get_serializer(page, many=True)
    7. return self.get_paginated_response(serializer.data)
    8. # 序列化
    9. serializer = self.get_serializer(queryset, many=True)
    10. return Response(serializer.data)
  1. 举例:

from rest_framework.mixins import ListModelMixin

class BookListView(ListModelMixin, GenericAPIView): queryset = BookInfo.objects.all() serializer_class = BookInfoSerializer

  1. def get(self, request):
  2. return self.list(request)
  1. ### 2)CreateModelMixin
  2. 创建视图扩展类,提供`create(request, *args, **kwargs)`方法快速实现创建资源的视图,成功返回201状态码。<br />如果序列化器对前端发送的数据验证失败,返回400错误。<br />源代码:

class CreateModelMixin(object): “”” Create a model instance. “”” def create(self, request, args, *kwargs):

  1. # 获取序列化器
  2. serializer = self.get_serializer(data=request.data)
  3. # 验证
  4. serializer.is_valid(raise_exception=True)
  5. # 保存
  6. self.perform_create(serializer)
  7. headers = self.get_success_headers(serializer.data)
  8. return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
  9. def perform_create(self, serializer):
  10. serializer.save()
  11. def get_success_headers(self, data):
  12. try:
  13. return {'Location': str(data[api_settings.URL_FIELD_NAME])}
  14. except (TypeError, KeyError):
  15. return {}
  1. ### 3) RetrieveModelMixin
  2. 详情视图扩展类,提供`retrieve(request, *args, **kwargs)`方法,可以快速实现返回一个存在的数据对象。<br />如果存在,返回200 否则返回404。<br />源代码:

class RetrieveModelMixin(object): “”” Retrieve a model instance. “”” def retrieve(self, request, args, *kwargs):

  1. # 获取对象,会检查对象的权限
  2. instance = self.get_object()
  3. # 序列化
  4. serializer = self.get_serializer(instance)
  5. return Response(serializer.data)
  1. 举例:

class BookDetailView(RetrieveModelMixin, GenericAPIView): queryset = BookInfo.objects.all() serializer_class = BookInfoSerializer

  1. def get(self, request, pk):
  2. return self.retrieve(request)
  1. ### 4)UpdateModelMixin
  2. 更新视图扩展类,提供`update(request, *args, **kwargs)`方法,可以快速实现更新一个存在的数据对象。<br />同时也提供`partial_update(request, *args, **kwargs)`方法,可以实现局部更新。<br />成功返回200,序列化器校验数据失败时,返回400错误。<br />源代码:

class UpdateModelMixin(object): “”” Update a model instance. “”” def update(self, request, args, *kwargs): partial = kwargs.pop(‘partial’, False) instance = self.get_object() serializer = self.get_serializer(instance, data=request.data, partial=partial) serializer.is_valid(raise_exception=True) self.perform_update(serializer)

  1. if getattr(instance, '_prefetched_objects_cache', None):
  2. # If 'prefetch_related' has been applied to a queryset, we need to
  3. # forcibly invalidate the prefetch cache on the instance.
  4. instance._prefetched_objects_cache = {}
  5. return Response(serializer.data)
  6. def perform_update(self, serializer):
  7. serializer.save()
  8. def partial_update(self, request, *args, **kwargs):
  9. kwargs['partial'] = True
  10. return self.update(request, *args, **kwargs)
  1. ### 5)DestroyModelMixin
  2. 删除视图扩展类,提供`destroy(request, *args, **kwargs)`方法,可以快速实现删除一个存在的数据对象。<br />成功返回204,不存在返回404。<br />源代码:

class DestroyModelMixin(object): “”” Destroy a model instance. “”” def destroy(self, request, args, *kwargs): instance = self.get_object() self.perform_destroy(instance) return Response(status=status.HTTP_204_NO_CONTENT)

  1. def perform_destroy(self, instance):
  2. instance.delete()

```

3. 几个可用子类视图

1) CreateAPIView

提供 post 方法
继承自: GenericAPIView、CreateModelMixin

2)ListAPIView

提供 get 方法
继承自:GenericAPIView、ListModelMixin

3)RetrieveAPIView

提供 get 方法
继承自: GenericAPIView、RetrieveModelMixin

4)DestoryAPIView

提供 delete 方法
继承自:GenericAPIView、DestoryModelMixin

5)UpdateAPIView

提供 put 和 patch 方法
继承自:GenericAPIView、UpdateModelMixin

6)ListCreateAPIView

提供 get、post方法
继承自: GenericAPIView、ListModelMixin、CreateModelMixin

7)RetrieveUpdateAPIView

提供 get、put、patch方法
继承自: GenericAPIView、RetrieveModelMixin、UpdateModelMixin

8)RetrieveUpdateDestoryAPIView

提供 get、put、patch、delete方法
继承自:GenericAPIView、RetrieveModelMixin、UpdateModelMixin、DestoryModelMixin