在视图类中,接下来会介绍2个视图基类,5个拓展类视图,9个拓展类视图的子类。

1. 视图基类

1.1 APIViews

1.1.1 继承APIView类的子类

导包:**from rest_framework.views import APIView**
**APIView****REST framework**提供的所有视图的基类,继承自Django的View类。
APIView与View的不同之处在于:

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

支持定义的属性:

  • 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) # many=True----指明序列化器需要翻序列化多个数据
  8. return Response(serializer.data)
  9. def put(self, request, pk):
  10. # 1、获取前端数据
  11. # data = request.body.decode()
  12. # data_dict = json.loads(data)
  13. data=request.data
  14. # 2、验证数据
  15. try:
  16. book = BookInfo.objects.get(id=pk)
  17. except:
  18. return JsonResponse({'error': '错误信息'}, status=400)
  19. ser = BookSerialzier(book, data=data)
  20. # 验证数据合法性
  21. ser.is_valid()
  22. # 3、更新数据
  23. ser.save()
  24. # 4、返回结果
  25. return Response(ser.data)

1.1.2 被@api_view()装饰的视图函数

在REST framework中,你也可以使用常规的基于函数的视图。它提供了一组简单的装饰器,用来包装你的视图函数,以确保视图函数会收到**Request**(而不是Django一般的HttpRequest)对象,并且返回**Response**(而不是Django的HttpResponse)对象,同时允许你设置这个请求的处理方式。

  1. @api_view()装饰器函数的参数:**@api_view(http_method_names=['GET'], exclude_from_schema=False)**

    • **http_method_names**:元素可以是**' GET '、' PUT '、' DELETE '、' PATCH '、' UPDATE '**其中的一个或多个的列表或元组,默认为** ' GET '**
    • **exclude_from_schema**值为True代表API视图忽视任何自动生成的视图,默认为False。
      1. @api_view(['GET', 'POST'],exclude_from_schema=False)
      2. def hello_world(request):
      3. if request.method == 'POST':
      4. return Response({"message": "Got some data!", "data": request.data})
      5. return Response({"message": "Hello, world!"})
  2. 除@api_view()装饰器外,DRF还提供了一组可以加到视图上的装饰器来重写默认值,这些装饰器必须放在@pai_view()装饰器后(下)面。

  • @renderer_classes(…)
  • @parser_classes(…)
  • @authentication_classes(…)
  • @throttle_classes(…)
  • @permission_classes(…)

这些装饰器和上文中的APIView的子类中设置的属性相对应,装饰器中的每一个都接受一个参数,这个参数必须是**类的列表或元组。**

1.2 GenericAPIView

  • 包:**from rest_framework.generics import GenericAPIView**
  • GenericAPIView继承自APIVIew,增加了对于列表视图和详情视图可能用到的通用支持方法。通常使用时,可搭配一个或多个Mixin扩展类。

支持定义的属性:

  • 列表视图与详情视图通用:
    • queryset ——列表视图的查询集
    • serializer_class ——- 视图使用的序列化器
  • 列表视图使用:
    • pagination_class ——分页控制类
    • filter_backends ——过滤控制后端
  • 详情页视图使用:

    • lookup_field ——查询单一数据库对象时使用的条件字段,默认为’pk
    • lookup_url_kwarg ——查询单一数据时URL中的参数关键字名称,默认与look_field相同
      提供的方法:
  • 列表视图与详情视图通用:

    • get_queryset(self)
      返回视图使用的查询集,是列表视图与详情视图获取数据的基础,默认返回queryset属性,可以重写,例如:
      1. def get_queryset(self):
      2. user = self.request.user
      3. return user.accounts.all()
  • 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

  • 返回序列化器对象,被其他视图或扩展类使用,如果我们在视图中想要获取序列化器对象,可以直接调用此方法。
    注意,在提供序列化器对象的时候,REST framework会向对象的context属性补充三个数据:request、format、view,这三个数据对象可以在定义序列化器时使用。
    get_serializer(self, args, *kwargs)
  • 详情视图使用:
    • get_object(self) 返回详情视图所需的模型类数据对象,默认使用lookup_field参数来过滤queryset。 在试图中可以调用该方法获取详情信息的模型类对象。
      若详情访问的模型类对象不存在,会返回404。
      该方法会默认使用APIView提供的check_object_permissions方法检查当前对象是否有权限被访问。

2. 五个拓展类

五个拓展类需要结合GenericAPIView一起使用。

2.1 ListModelMixin

列表视图扩展类,提供**list(request, *args, **kwargs)**方法快速实现列表视图,返回200状态码。