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() 或者其他请求方式的方法。

python的book_drf目录下新建apiview_view.py文件,

from rest_framework.views import APIView
from rest_framework.response import Response
from book_drf.serializer import BookSerializer
from books.models import BookInfo


class Books(APIView):
    def get(self, request):
        # 此处跟django.views获取参数不一样的地方
        # 可以获取类似 ?a=10&b=11 这部分参数
        print(request.query_params)
        # 1、查询所有图书对象
        books = BookInfo.objects.all()
        ser = BookSerializer(books, many=True)
        # 此处跟django.views.View返回不一样
        return Response(ser.data)

    def post(self, request):
        #此处跟django.views.View
        # 1、获取前端数据
        data = request.data
        # 2、验证数据
        ser = BookSerializer(data=data)
        ser.is_valid()  # 验证方法

        # 3、保存数据
        ser.save()
        # 4、返回结果
        # 此处跟django.views.View返回不一样
        return Response(ser.data)


class Book(APIView):
    def get(self, request):
        book = BookInfo.objects.get(id=1)
        ser = BookSerializer(book)
        # 此处跟django.views.View返回不一样
        return Response(ser.data)


class BookDRFView(APIView):
    """
        获取单一和更新和删除
    """

    def put(self, request, pk):
        # 此处跟django.views.View
        # 1、获取前端数据
        data = request.data
        # 2、验证数据
        try:
            book = BookInfo.objects.get(id=pk)
        except:
            return Response({'error': '错误信息'}, status=400)
        ser = BookSerializer(book, data=data)
        ser.is_valid()
        # 3、更新数据
        ser.save()
        # 4、返回结果
        # 此处跟django.views.View返回不一样
        return Response(ser.data)

    def delete(self, request, pk):
        # 此处跟django.views获取参数不一样的地方
        # 可以获取类似 ?a=10&b=11 这部分参数
        print(pk)
        print(request.query_params)
        try:
            book = BookInfo.objects.get(id=pk)
        except:
            return Response({'error': '错误信息'}, status=400)

        book.is_delete = True
        book.save()
        # 此处跟django.views.View返回不一样
        return Response({})