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