Django REST Framework(DRF)框架之视图类(视图基类、Mixin扩展类、子类视图)

news/2024/11/17 6:49:41/

DRF框架之视图类的使用

  • 视图类概述
    • 视图基类
    • Mixin扩展类
    • 子类视图类
  • 视图基类
    • APIView
    • GenericAPIView
  • Mixin扩展类
    • ListModelMixin
    • CreateModelMixin
    • RetrieveModelMixin
    • UpdateModelMixin
    • DestroyModelMixin
  • 子类视图
    • ListAPIView
    • CreateAPIView
    • RetrieveAPIView
    • DestoryAPIView
    • UpdateAPIView
    • ListCreateAPIView
    • RetrieveUpdateAPIView
    • RetrieveDestroyAPIView
    • RetrieveUpdateDestoryAPIView

视图类概述

在Django REST Framework中,视图类是处理请求的核心组件。可以通过多种方式定义视图,包括视图基类、Mixin扩展类和子类视图。

视图基类

使用视图基类时,需要继承一个或多个基类,并实现相应的方法。例如,如果继承了 APIView,需要实现 get()、post()、put()、delete() 等方法。

1. APIView:用于处理任何类型的HTTP请求,并自定义响应行为。
2. GenericAPIView:与 APIView 类似,但具有一些内置的通用方法,例如对象查询和序列化处理。

Mixin扩展类

Mixin是一种用于解决类之间代码重用的设计模式。在 DRF中,Mixin类是用于扩展视图功能的辅助类。

Mixin扩展类通常与视图基类一起使用。例如,编写一个 AuthenticationMixin类来添加身份验证功能,然后将其与 APIView基类一起使用。

1. ListModelMixin:实现获取资源列表的逻辑
2. CreateModelMixin:实现创建数据资源的逻辑
3. RetrieveModelMixin:实现获取单个资源的逻辑
4. UpdateModelMixin:实现更新现有数据资源的逻辑
5. DestoryModelMixin:实现删除数据资源的逻辑

子类视图类

子类视图是DRF 中最高级别的视图类型。它们是基于已经定义的视图和Mixin来创建的,具有更优雅的代码结构。可以通过继承一个或多个Mixin和一个视图基类来创建子类视图。

使用子类视图时,只需要实现所需的方法即可。例如,如果继承了ListAPIView 类,只需要实现 get_queryset() 方法即可。

1. ListAPIView:获取数据列表的视图类
2. CreateAPIView:创建新数据资源的视图类
3. RetrieveAPIView:获取单个资源的视图类
4. UpdateAPIView:更新现有数据资源的视图类
5. DestroyAPIView:删除数据资源的视图类
6. ListCreateAPIView:结合ListAPIView 和 CreateAPIView 的视图类,用于同时获取和创建数据资源。
7. RetreiveUpdateAPIView:结合RetrieveAPIView 和 UpdateAPIView 的视图类,用于同时获取和更新单个数据资源。
8. RetrieveDestroyAPIView:结合RetrieveAPIView 和 DestroyAPIView 的视图类,用于同时获取和删除单个数据资源。
9. RetrieveUpdateDestroyAPIView:结合RetrieveAPIView、UpdateAPIView 和 DestroyAPIView 的视图类,用于同时获取、更新和删除单个数据资源。

视图基类

APIView

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

APIView与View的不同之处在于:

传入到视图中的request对象是REST framework的Request对象,而不是Django原始的HttpRequest对象视图可以直接返回REST framework的Response对象,响应数据会根据客户端请求头Accpet自动转换为对应的格式进行返回任何APIException异常都会被捕获到,并且处理成合适的响应信息返回给客户端在进行dispatch()分发前,会对请求进行身份认证、权限检查、流量控制

1.Request对象

视图继承APIView之后,传入视图的request对象是DRF框架提供的Request类的对象,Request类的对象有两个属性:

属性名说明
data包含解析之后的请求体数据,已经解析为了字典或类字典,相当于Django原始request对象的body、POST、FILES属性
query_params包含解析之后的查询字符串数据,相当于Django原始request对象的GET属性

2.Response对象

视图继承APIView之后,响应时可以统一返回Response对象

原始的响应数据,会根据客户端请求头的Accpet,自动转换为对应的格式并进行返回

Accept请求头说明
application/json服务器会将原始响应数据转换为json数据进行返回,没指定Accept时,默认返回json
text/html服务器会将原始响应数据转换为html网页进行返回;

3.APIView的使用

re_path(r'^test/$', views.TestView.as_view(), name='test'),
from rest_framework.response import Response
from rest_framework.views import APIViewfrom apps.users.models import User
from apps.users.serializers import UserSerializerclass TestView(APIView):def get(self, request):queryset = User.objects.all()# 序列化serializer = UserSerializer(queryset, many=True)return Response(serializer.data)def post(self, request):# 反序列化-数据校验serializer = UserSerializer(data=request.data)serializer.is_valid(raise_exception=True)# 反序列化-数据保存serializer.save()return Response(serializer.data, status=status.HTTP_201_CREATED)
re_path(r'^test/(?P<pk>\d+)/$', views.TestView.as_view(), name='test'),
class TestView(APIView):def get(self, request, pk):try:user = User.objects.get(id=pk)except User.DoesNotExist:raise Http404# 数据进行序列化serializer = UserSerializer(user)print(serializer.data)return Response(serializer.data)def put(self, request, pk):try:user = User.objects.get(id=pk)except User.DoesNotExist:raise Http404# 反序列化-数据校验serializer = UserSerializer(user, data=request.data)serializer.is_valid(raise_exception=True)# 反序列化-数据保存serializer.save()return Response(serializer.data)def delete(self, request, pk):try:user = User.objects.get(id=pk)except User.DoesNotExist:raise Http404user.delete()return Response(status=status.HTTP_204_NO_CONTENT)

GenericAPIView

GenericAPIView继承自APIVIew,在APIView功能基础上,增加了操作序列化器和数据库查询的方法,作用是为Mixin扩展类的执行提供方法支持。通常在使用时,可搭配一个或多个Mixin扩展类。

1.提供的关于序列化器使用的属性与方法

属性:

serializer_class:指明视图使用的序列化器

方法:

get_serializer_class(self) : 返回序列化器类,默认返回serializer_class,可以重写get_serializer(self, args, **kwargs) : 返回创建序列化器类的对象,如果我们在视图中想要创建序列化器对象,可以直接调用此方法

2.提供的关于数据库查询的属性与方法

属性:

queryset:指明使用的数据查询集

方法:

get_queryset(self):返回视图使用的查询集,默认返回queryset属性,可以重写get_object(self):返回从视图使用的查询集中查询指定的对象(默认根据pk进行查询),如查询不到,此方法会抛出Http404异常

3.其他可以设置的属性

pagination_class:指明分页控制类filter_backends:指明过滤控制后端

GenericAPIView的使用

re_path(r'^test/$', views.TestView.as_view(), name='test'),
class TestView(GenericAPIView):# 指定视图所使用的序列化器类serializer_class = UserSerializer# 指定视图所使用的查询集queryset = User.objects.all()def get(self, request):queryset = self.get_queryset()# 序列化serializer = self.get_serializer(queryset, many=True)return Response(serializer.data)def post(self, request):# 反序列化-数据校验serializer = self.get_serializer(data=request.data)serializer.is_valid(raise_exception=True)# 反序列化-数据保存serializer.save()return Response(serializer.data, status=status.HTTP_201_CREATED)
re_path(r'^test/(?P<pk>\d+)/$', views.TestView.as_view(), name='test'),
class TestView(GenericAPIView):# 指定视图所使用的序列化器类serializer_class = UserSerializer# 指定视图所使用的查询集queryset = User.objects.all()def get(self, request, pk):instance = self.get_object()serializer = UserSerializer(instance)return Response(serializer.data)def put(self, request, pk):instance = self.get_object()# 反序列化-数据校验serializer = UserSerializer(instance, data=request.data)serializer.is_valid(raise_exception=True)# 反序列化-数据保存serializer.save()return Response(serializer.data)def delete(self, request, pk):instance = self.get_object()instance.delete()return Response(status=status.HTTP_204_NO_CONTENT)

Mixin扩展类

使用GenericAPIView,其中代码和视图所使用的序列化器类和查询集已经没有直接关系,DRF其实已经做了封装,就是5个Mixin扩展类。

ListModelMixin

列表视图扩展类,提供list(request, *args, **kwargs)方法快速实现列表视图,返回200状态码。该Mixin的list方法会对数据进行过滤和分页。

class TestView(ListModelMixin, GenericAPIView):serializer_class = UserSerializerqueryset = User.objects.all()def get(self, request):return self.list(request)

CreateModelMixin

创建视图扩展类,提供create(request, *args, **kwargs)方法快速实现创建资源的视图,成功返回201状态码。如果序列化器对前端发送的数据验证失败,返回400错误。

class TestView(CreateModelMixin, GenericAPIView):serializer_class = UserSerializerqueryset = User.objects.all()def post(self, request):print(request.data)return self.create(request)

在这里插入图片描述

RetrieveModelMixin

详情视图扩展类,提供retrieve(request, *args, **kwargs)方法,可以快速实现返回一个存在的数据对象。如果存在,返回200, 否则返回404。

 re_path(r'^test/(?P<pk>\d+)/$', views.TestView.as_view(), name='test'),
class TestView(RetrieveModelMixin, GenericAPIView):serializer_class = UserSerializerqueryset = User.objects.all()def get(self, request, pk):return self.retrieve(request, pk)

UpdateModelMixin

更新视图扩展类,提供update(request, *args, **kwargs)方法,可以快速实现更新一个存在的数据对象。成功返回200,序列化器校验数据失败时,返回400错误。

re_path(r'^test/(?P<pk>\d+)/$', views.TestView.as_view(), name='test'),
class TestView(UpdateModelMixin, GenericAPIView):serializer_class = UserSerializerqueryset = User.objects.all()def put(self, request, pk):return self.update(request, pk)

在这里插入图片描述
注意:当遇到以下异常时,需要在URL末尾添加/

RuntimeError: You called this URL via PUT, but the URL doesn't end in a slash and you have APPEND_SLASH set. Django can't redirect to the slash URL while maintaining PUT data. Change your form to point to 127.0.0.1:8000/test/3/ (note the trailing slash), or set APPEND_SLASH=False in your Django settings.

DestroyModelMixin

删除视图扩展类,提供destroy(request, *args, **kwargs)方法,可以快速实现删除一个存在的数据对象。成功返回204,不存在返回404。

re_path(r'^test/(?P<pk>\d+)/$', views.TestView.as_view(), name='test'),
class TestView(DestroyModelMixin, GenericAPIView):serializer_class = UserSerializerqueryset = User.objects.all()def delete(self, request, pk):return self.destroy(request, pk)

子类视图

Django框架为了方便视图的编写,还提供了9个子类视图类,子类视图类同时继承了GenericAPIView和对应的Mixin扩展类,而且还提供了对应的请求处理方法。

ListAPIView

ListAPIView继承自:GenericAPIView、ListModelMixin,提供get方法

re_path(r'^test/$', views.TestView.as_view(), name='test'),
class TestView(ListCreateAPIView):serializer_class = UserSerializerqueryset = User.objects.all()

Get http://127.0.0.1:8000/test/

CreateAPIView

CreateAPIView继承自: GenericAPIView、CreateModelMixin,提供 post 方法

RetrieveAPIView

RetrieveAPIView继承自: GenericAPIView、RetrieveModelMixin,提供 get 方法

re_path(r'^test/(?P<pk>\d+)/$', views.TestView.as_view(), name='test'),
class TestView(RetrieveAPIView):serializer_class = UserSerializerqueryset = User.objects.all()

Get http://127.0.0.1:8000/test/1/

DestoryAPIView

DestoryAPIView继承自:GenericAPIView、DestoryModelMixin,提供 delete 方法

UpdateAPIView

UpdateAPIView继承自:GenericAPIView、UpdateModelMixin,提供 put 和 patch 方法

ListCreateAPIView

ListCreateAPIView继承自:GenericAPIView、ListModelMixin、CreateModelMixin,提供 get 和 post 方法

RetrieveUpdateAPIView

RetrieveUpdateAPIView继承自: GenericAPIView、RetrieveModelMixin、UpdateModelMixin,提供 get、put、patch方法

RetrieveDestroyAPIView

RetrieveDestroyAPIView继承自: GenericAPIView、RetrieveModelMixin、UpdateModelMixin,提供 get 和 delete 方法

RetrieveUpdateDestoryAPIView

RetrieveUpdateDestoryAPIView继承自:GenericAPIView、RetrieveModelMixin、UpdateModelMixin、DestoryModelMixin,提供 get、put、patch、delete方法


http://www.ppmy.cn/news/46220.html

相关文章

4.1、网络结构模式

4.1、网络结构模式 1.C/S结构①C/S结构简介②C/S结构优点③C/S结构缺点 2.B/S结构①B/S结构简介②B/S结构优点③B/S结构缺点 1.C/S结构 ①C/S结构简介 服务器 - 客户机&#xff0c;即 Client - Server&#xff08;C/S&#xff09;结构。C/S 结构通常采取两层结构。服务器负责…

成为程序员后才知道的6件事,第5点看完很心酸!

曾几时&#xff0c;总觉得IT精英外表光鲜亮丽&#xff0c;尤其是程序员咔咔咔打代码&#xff0c;月入几个w&#xff0c;不光挣得多&#xff0c;上班期间还能玩电脑游戏。但是&#xff0c;真正当了程序员之后&#xff0c;OMG!我再也不这样想了&#xff01;好多事都是当了程序员才…

【强化学习】分层强化学习

最近一直在做实验的一篇论文有一些些分层强化学习的思想&#xff0c;就来学一学真分层强化学习&#xff0c;虽然已经是三四年前流程的东西了&#xff0c;但也有了解的必要&#xff08;要不不知道怎么入手了&#xff09; 分层强化学习的主要思想是将一个复杂的任务分成很多个子…

从入门到精通:SEO站外优化全面解析

通过​​第三章​​上下连续两期的干货内容&#xff0c;相信你已经掌握了 SEO 优化的基本方法&#xff0c;但你有没有发现&#xff1a;之前的内容都是针对网站本身进行优化的方法&#xff0c;其实&#xff0c;SEO 还有相当一部分功夫要放在站外优化上。 问题来了&#xff1a;站…

GIS开源库GEOS库学习教程(三):空间关系/DE-9IM/谓词

1、DE-9IM 要判断两个多边形的关系&#xff0c;实际上属于几何图形空间关系判断。几何图形并不只有多边形一种&#xff0c;它包括点、线、面构成的任何图形&#xff0c;两两之间相互关系也有很多种&#xff0c;因此空间关系非常复杂。根据前人的研究&#xff0c;总结出了DE-9IM…

Linux网络-传输层UDP/TCP详解

目录 计算机网络的层状结构 UDP协议 UDP报文格式 理解UDP/TCP报文的本质 UDP的特点 UDP的缓冲区 sendto/recvfrom/send/recv/write/read IO类接口 UDP是全双工的 UDP注意事项 UDP协议&#xff0c;实现简单聊天室&#xff08;服务端客户端&#xff09; TCP协议 TCP协…

php跨域调用json的例子

JSON和XML没什么太大区别&#xff0c;不过JSON有一个更大范围的应用&#xff0c;那就是&#xff0c;跨域的数据调用。由于安全性问题&#xff0c;AJAX不支持跨域调用&#xff0c;这样要调用不同域名下的数据&#xff0c;很麻烦。下面这个例子&#xff0c;足以展示php用json如何…

java运动会成绩管理系统dzkf0534程序

借助java编程语言、jsp技术、MySQL数据库和tomcat服务器来完成系统的所有功能&#xff0c;最后进行系统测试&#xff0c;来检测系统的权限和漏洞&#xff0c;从而将系统完善&#xff0c;达到符合标准。 &#xff0e;系统登录&#xff1a;系统登录是用户访问系统的路口&#xff…