APIView
通过看源码可以发现 APIView 直接继承了 Django View 这个基类,在此基础上添加了 render_classes, parser_classes, authentication_classes 等等,由此可见 APIView 还是比较偏底层的, 但通过使用它可以相对灵活实现一些自定义功能。
介绍APIView:APIView 类与 Django原生View 有以下区别:
- 当客户端发来请求会被 DRF 的 Request 对象中的 handler 方法(get, post etc.) 处理,而非 Django 的 HttpRequest 对象
- Handler 方法返回 DRF 的 Request 对象, View 会管理返回结果最终渲染回 Response
- 任何 APIException 都会被捕获且返回相应的报错
- 收到的客户端请求会先被进行权限认证等步骤后才分发给 handler 方法
在使用上 APIView 类与 View 几乎相差不大。收到的客户端请求会被分发到相关的 handler 方法如:.get(), .post()。由于不同 API 的 policy 的不同,APIView 中设置了相应的属性。
下面编写一个简单的 view.py with APIView
参照:1 from products.models import Product 2 from products.serializers import ProductSerializer 3 from django.http import Http404 4 from rest_framework.views import APIView 5 from rest_framework.response import Response 6 from rest_framework import status 7 8 9 class ProductListView(APIView): 10 """11 List all products12 """13 def get(self, request, format=None):14 products = Product.objects.all()15 products_serializer = ProductSerializer(products, many=True) # 序列化 products 对象成 json 格式;many 表示返回多条数据16 return Response(products_serializer.data)17 18 def post(self, request, format=None):19 serializer = ProductSerializer(data=request.data)20 if serializer.is_valid():21 serializer.save() # call serializer "create" method22 return Response(serializer.data, status=status.HTTP_201_CREATED)23 return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
注: ProductSerializer 实现见之前的文章 (https://www.cnblogs.com/crazy-chinese/p/9828095.html)