django-rest-framework-从零开始-5-视图类APIView的使用

发布时间 2023-03-22 21:11:25作者: 南风丶轻语

django-rest-framework-从零开始-5-视图类APIView的使用

1、前言

之前编写的视图函数,都是基于@api_view函数创建出的视图,通过判断request.method获取到请求方式,然后执行对应的逻辑。接下来,我们基于类创建视图。

2、创建APIView类视图

1.创建视图只需要继承APIView类,即可

2.修改对应的路由

改造student_manager/views.py文件,把基于@api_view编写的视图,变成基于APIView类的视图

class StudentList(APIView):
    @staticmethod
    def get(request):
        result = Student.objects.all()
        serializer = StudentSerializer(result, many=True)
        return Response(serializer.data)

    def post(self, request):
        data = request.data
        serializer = StudentSerializer(data=data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)


class StudentDetail(APIView):
    @staticmethod
    def get_object(pk):
        try:
            return Student.objects.get(pk=pk)
        except Student.DoesNotExist:
            raise Http404

    def get(self, request, pk):
        obj = self.get_object(pk)
        serializer = StudentSerializer(instance=obj)
        return Response(serializer.data)

    def put(self, request, pk):
        snippet = self.get_object(pk)
        serializer = StudentSerializer(snippet, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    def delete(self, request, pk):
        obj = self.get_object(pk)
        obj.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)

图示

image-20230317100253477

改造路由,修改student_manager/urls.py文件,修改路由

path('list/', StudentList.as_view()),
re_path(r'detail/([0-9]+)/', StudentDetail.as_view()),

图示

image-20230317100212628

说明

  • 基于APIView类创建出的视图,需要重写"get","post","put","patch","delete"等方法,发起的请求,会根据请求方式来执行对应的视图。

  • 关于为什么是重写这些方法,发起请求后怎么决定访问哪一个视图,可以从路由APIView类的as_view()方法得到答案

  • 查看as_view()的函数定义源代码,最终在基类View中,可以看到,先调用了setup函数,然后调用了dispatch函数(学习链接

    image-20230317101404124

  • 查看setup函数和dispatch函数

image-20230317101908944

可以看到,首先判断是否请求在["get","post","put","patch", "delete","head","options","trace",]中,在其中则合理,合理就会获取对象的方法,然后返回该方法。

因此,每个请求对应APIView类的一个方法,所以我们需要把对应方法定义出来。为定义出来的,则抛出405

"detail": "Method "请求方式" not allowed."不得不说,这个用法挺好。

3、启动服务,测试基于APIView类视图

测试和之前一样。

github:https://github.com/rainbow-tan/learn-drf