其他分享
首页 > 其他分享> > drf基本视图类APIView

drf基本视图类APIView

作者:互联网

rest_framework.views.APIView

APIView是REST framework提供的所有视图类的基类,继承自Django的view父类

APTview与view的不同之处在于:

  传入到视图方法中的是REST framework的Request对象,而不是Django的 HttpRequeset对象

    视图方法可以返回REST framework的Response对象,视图会为响应数据设置(renderer)符合前端期望要求的格式

  任何 APIException异常都会被捕获到,并且处理成合适格式的响应信息返回给客户端

    django的View中所有异常全部以HTML格式显示

    drf的APIVlew或者APIView的子类会自动根据客户端的Accept进行错误信息的格式转换

  重新声明了一个新的as_view方法并在dispatch()进行路由分发前,会对请求的客户端进行身份认证、权限检查、流量控制

 

APIView除了继承了View原有的属性方法意外,还新增了类属性:

   authentication_classes列表或元组,身份认证类

  permissoin_classes列表或元组,权限检查类

  throttle_classes列表或元祖,流量控制类

在APIview中仍以常规的类视图定义方法来实现get(). post()或者其他请求方式的方法。

from rest_framework.views import APIView
from rest_framework.response import Response
from .models import Student
from .serializers import StudentModelSerializer


class StudentAPIView(APIView):
    def get(self,request):
        #1.数据库中读取学生列表信息
        student_list=Student.objects.all()
        #2.实例化序列化器,获取序列化对象
        serializer=StudentModelSerializer(instance=student_list,many=True)
        #3.转换数据并返回给客户端
        return Response(serializer.data,status=200)

    def post(self,request):
        #1.获取客户端提交的数据,实例化序列化器,获取序列化对象
        serializer=StudentModelSerializer(data=request.data)
        #2.反序列化[验证数据、保存数据到数据库]
        serializer.is_valid(raise_exception=True)
        serializer.save()
        #3.返回
        return Response(serializer.data,status=201)

class StudentInfoAPIView(APIView):
    def get(self,request,pk):
        #1.获取数据
        try:
            student=Student.objects.get(pk=pk)
        except Student.DoesNotExist:
            return Response({"error":"查无此人"},status=404)
        #2.序列化
        serializer=StudentModelSerializer(instance=student)
        #3.返回
        return Response(serializer.data)
    
    def put(self,request,pk):
        #1.获取数据库数据
        try:
            student=Student.objects.get(pk=pk)
        except Student.DoesNotExist:
            return Response({"error":"查无此人"},status=404)
        #2.获取客户端数据
        serializer=StudentModelSerializer(instance=student,data=request.data)
        #3.反序列化[验证数据、保存数据到数据库]
        serializer.is_valid(raise_exception=True)
        serializer.save()#包括创建和更新
        #4.返回
        return Response(serializer.data,status=201)
    
    def delete(self,request,pk):
        #1.获取数据并删除
        try:
            Student.objects.get(pk=pk).delete()
        except Student.DoesNotExist:
            return Response({"error":"查无此人"},status=404)
        #2.返回结果
        return Response(status=204)

urls:

from django.urls import path,re_path
from . import views

# 路由列表
urlpatterns = [
    path("students/",views.StudentAPIView.as_view()),
    re_path(r"students/(?P<pk>\d+)/",views.StudentInfoAPIView.as_view())
    
]

 

标签:return,APIView,视图,Student,pk,Response,serializer,drf
来源: https://www.cnblogs.com/fuck-Innovative-training/p/16664396.html