视图集与路由Routers详解

  • 视图集
    • ViewSet视图集
      • 代码实现
    • GenericViewSet视图集
      • 代码实现
    • ModelViewSet视图集
    • ReadOnlyModelViewSet视图集
  • 路由Routers
    • 使用方法
      • 具体实现操作
    • 视图集中附加action的声明

视图集

ViewSet视图集

继承自APIView与ViewSetMixin,作用也与APIView基本类似,提供了身份认证、权限校验、流量管理等

ViewSet主要通过继承ViewSetMixin来实现在调用as_view()时传入字典{“http请求”:“视图方法名称”}的映射处理请求,如{‘get’:‘list’}

在ViewSet中,没有提供任何动作action方法,需要我们自己实现action方法

使用视图集ViewSet,可以将一系列视图方法相关的操作和相关的http请求动作封装到一个类中:

  • list() 提供一组数据
  • retrieve() 根据传入pk值,提供一个数据
  • create() 创建数据
  • update() 更新数据
  • destory() 删除数据

ViewSet视图集类不再限制视图方法名只允许get()、post()等这样的方法名,而是实现允许开发者根据自己的需求自定义方法名,例如 list() 、create() 等,然后在路由中将这些视图方法名与http请求进行绑定,调用

代码实现

  • 创建一个新的子应用方便操作,并将此子应用进行注册:
python manage.py startapp viewset
  • 模型类还是使用前面博客中的学生模型
    views.py文件:
from rest_framework import serializers
from rest_framework import status
from rest_framework.response import Response
from rest_framework.viewsets import ViewSetfrom .models import Students# 定义模型序列化器
class StudentSerializers(serializers.ModelSerializer):class Meta:model = Studentsfields = '__all__'# viewset视图集
class StudentsViewSet(ViewSet):# 获取一组数据def get_all_student(self, request):student = Students.objects.all()ser = StudentSerializers(instance=student, many=True)return Response(ser.data, status=status.HTTP_200_OK)# 创建数据def create_student(self, request):ser = StudentSerializers(data=request.data)if not ser.is_valid():return Response(ser.errors, status=status.HTTP_404_NOT_FOUND)ser.save()return Response(ser.data, status=status.HTTP_201_CREATED)# 获取单个数据def get_one_student(self, request, pk):student = Students.objects.get(pk=pk)ser = StudentSerializers(instance=student)return Response(ser.data, status=status.HTTP_200_OK)# 修改数据def update_student(self, request, pk):student = Students.objects.get(pk=pk)ser = StudentSerializers(instance=student, data=request.data)if not ser.is_valid():return Response(ser.errors, status=status.HTTP_404_NOT_FOUND)ser.save()return Response(ser.data, status=status.HTTP_201_CREATED)# 删除数据def delete_student(self, reqeust, pk):Students.objects.get(pk=pk).delete()return Response(status=status.HTTP_204_NO_CONTENT)
  • 查看一组数据:
  • 添加一条数据:
  • 查看是否添加成功:
  • 查看单个学生数据信息:
  • 修改单个学生信息:
  • 查看是否修改成功:
  • 删除单个学生信息:
  • 查看是否删除成功:

GenericViewSet视图集

继承自GenericAPIView和ViewSetMixin,作用让视图集的视图代码变得更加通用,抽取独特代码,作为视图类的类属性

前面我们使用ViewSet通常并不方便,因为list、retrieve、create、update、destory等方法都需要自己编写,而这些方法与前面讲过的Mixin扩展类提供的方法同名,所以我们可以通过继承Mixin扩展类来复用这些方法而无需自己编写。但是Mixin扩展类依赖于GenericAPIView,所以还需要继承GenericAPIView

GenericViewSet就帮助我们完成了这样的继承工作,继承自GenericAPIView与ViewSetMixin,在实现了调用as_view()时传入字典(如{‘get’:‘list’})的映射处理工作的同时,还提供了GenericAPIView提供的基础方法,可以直接搭配Mixin扩展类使用

代码实现

  • 结合我们前面博客讲解的模型扩展类,实现操作:
from rest_framework import serializers
from rest_framework.mixins import ListModelMixin, CreateModelMixin, RetrieveModelMixin, UpdateModelMixin, \DestroyModelMixin
from rest_framework.viewsets import GenericViewSetfrom .models import Students# 定义模型序列化器
class StudentSerializers(serializers.ModelSerializer):class Meta:model = Studentsfields = '__all__'# 将模型扩展类与GenericViewSet视图集结合高效使用
class StudentsGenericViewSet(GenericViewSet, ListModelMixin, CreateModelMixin, RetrieveModelMixin, UpdateModelMixin,DestroyModelMixin):queryset = Students.objectsserializer_class = StudentSerializers
  • 实现的结果与上面viewset效果相同!!!

ModelViewSet视图集

  • 上述完成的模型类继承了很多的扩展类,书写不方便,可以将这么多扩展类简写为:ModelViewSet
  • ModelViewSet继承自GenericViewSet,同时包括了ListModelMixin、RetrieveModelMixin、CreateModelMixin、UpdateModelMixin、DestoryModelMixin这些扩展类

ReadOnlyModelViewSet视图集

  • ReadOnlyModelViewSet承自GenericViewSet,同时包括了ListModelMixin、RetrieveModelMixin

路由Routers

对于视图集ViewSet,我们除了可以自己手动指明请求方式与动作action之间的对应关系外,还可以使用路由Routers来帮助我们快速实现路由信息绑定、调用

REST framework提供了两个router类

  • SimpleRouter
  • DefaultRouter

使用方法

  1. 创建router对象,并注册视图集
from rest_framework import routersrouter = routers.DefaultRouter()
router.register('students/', StudnetsView, basename='students')

注册视图集参数如下:
register(prefix, viewset, base_name)

  • prefix 该视图集的子路由前缀
  • viewset 视图集
  • base_name 路由别名的前缀,可用书路由的重定向
    生成路由如下:
^studnets/$    name: stduents-list # 全部数据操作
^studnets/{pk}/$   name: studnets-detail # 单个数据操作
  1. 添加路由
    两种方法:
urlpatterns = [...
]
urlpatterns += router.urls

或者:

urlpatterns = [...path('^', include(router.urls))
]

具体实现操作

from rest_framework.routers import DefaultRouterfrom . import views# 实例化路由类
router = DefaultRouter()# 注册视图集
router.register('students', views.StudentsGenericViewSet)# 将生成的路由集添加到urlpatterns中
urlpatterns = []
urlpatterns += router.urls
  • 上述的操作,会将StudentsGenericViewSet的路由更换为自动生成的路由集,与不使用路由routers的实现效果相同

视图集中附加action的声明

在视图集中,如果想要让Router自动生成我们自定义动作的路由信息,需要使用rest_framework.decorators.action装饰器

以action装饰器装饰的方法名会作为action动作名,与list、retrieve等同

action装饰器可以接收两个参数:

  • methods: 声明该action对应的请求方式,列表

  • detail: 声明该action的路径是否与单一资源对应,True:单个数据操作,False:多个数据操作

路由生成如下:

  • 路由前缀/< pk >/action方法名/

  • True 表示路径格式是xxx/< pk >/action方法名/

  • False 表示路径格式是xxx/action方法名/

url_path:声明该action的路由尾缀

简单举例如下:

from rest_framework import serializers
from rest_framework.decorators import action
from rest_framework.response import Response
from rest_framework.viewsets import ModelViewSetfrom .models import Students# 定义模型序列化器
class StudentSerializers(serializers.ModelSerializer):class Meta:model = Studentsfields = '__all__'class StudentsModelView(ModelViewSet):queryset = Students.objectsserializer_class = StudentSerializers@action(methods=['get'], detail=False, url_path='login')def login(self, request):"""登录"""return Response({'message': '成功!!'})


路由文件如下:

from rest_framework.routers import DefaultRouterfrom . import views# 实例化路由类
router = DefaultRouter()# 注册视图集
router.register('students', views.StudentsModelView)# 将生成的路由集添加到urlpatterns中
urlpatterns = []
urlpatterns += router.urls

python Django Rest_Framework框架 视图集与路由Routers详解(图文并茂版)相关推荐

  1. Neo4j因果集群路由策略详解及驱动访问

    Neo4j的使用和大多数数据库一样,如果您只想查询,这很简单.使用驱动程序,创建连接,提交查询并返回结果,如此简单! 如果您正在使用数据库集群,那么要做的事情不止这些.首先,数据库实例不是单个节点,而 ...

  2. 四十七、python学习之Django框架(DRF框架三):Request与Response、视图与视图集、路由

    Django REST framwork 提供的视图的主要作用: 控制序列化器的执行(检验.保存.转换数据); 控制数据库查询的执行 一.Request与Response: 1. Request:   ...

  3. java中fitlter,068.Python框架Django之DRF视图集使用

    一 视图集与路由的使用 使用视图集ViewSet,可以将一系列逻辑相关的动作放到一个类中: list() 提供一组数据 retrieve() 提供单个数据 create() 创建数据 update() ...

  4. python django restful框架_python+django+rest框架配置创建方法

    安装好所需要的插件和包: python.django.pip等版本如下: 采用Django REST框架3.0 1.在python文件夹下D:\python\Lib\site-packages\dja ...

  5. python 自动化发送邮件_Python自动化必备发送邮件报告脚本详解

    #!/usr/bin/python3 # -*- coding:UTF-8 -*- import smtplib #smtplib库主要用来连接第三方smtp库,用来发邮件 from email.mi ...

  6. python数组相减_对Python 中矩阵或者数组相减的法则详解

    对Python 中矩阵或者数组相减的法则详解 最近在做编程练习,发现有些结果的值与答案相差较大,通过分析比较得出结论,大概过程如下: 定义了一个计算损失的函数: def error(yhat,labe ...

  7. Django基础(35): 全局上下文处理器(Context Processors)详解及如何自定义模板上下文处理器...

    Django的Context Processors的中文名字有很多种,有人翻译成文本处理器,也有人翻译成上下文处理器.小编最喜欢的翻译是全局上下文处理器,因为它的主要作用就是向模板传递需要全局使用的变 ...

  8. 前端路由模式详解(hash和history)

    前端路由模式详解(hash和history) 前端路由有两种模式:hash 模式和 history 模式,接下来分析这两种模式的实现方式和优缺点. hash 模式 hash 模式是一种把前端路由的路径 ...

  9. 运维工程师必备之负载 均衡集群及LVS详解

    原文地址:运维工程师必备之负载 均衡集群及LVS详解作者:蚁巡运维平台 来源: chrinux 的BLOG 时间: 2013-07-01 14:00 此博文主要介绍集群和负载均衡的基本理论和类别,内容 ...

最新文章

  1. 20张图助你了解JVM运行时数据区,你还觉得枯燥吗?
  2. Android-TCPDump for Android(抓TCP数据包工具)
  3. UIButton拖动响应事件,距离问题
  4. python send 案例_python socket编程入门(编写server实例)+send 与sendall的区别与使用方法...
  5. 游戏美术经验分享:如何提升游戏角色设计能力
  6. JAVAAPI之STRING类和STRINGBUFER类
  7. 合同相似可逆等价矩阵的关系及性质_线性代数预习自学笔记-11:等价性与相似性...
  8. 实例学习SSIS(五)--理论介绍SSIS
  9. Google C++ style guide——命名约定
  10. 穹顶之下 众信金融邀您共植树助环保
  11. [转载] python中的内置异常结构
  12. paip.lucene 4.3 中文语义搜索最佳实践
  13. 华为云服务查找手机_华为云服务里面的手机找回需要什么条件
  14. Linux好用命令之dig命令
  15. 2019计算机四级网络工程师大纲,计算机四级《网络工程师》考试大纲
  16. java 出路 xls_java读取excel之xlsl超大文件
  17. 消费评价网 | 线上保险消费调查报告 虚假宣传多 捆绑销售坑人
  18. github可以跨月显示日期的jquery日历插件pickadate
  19. Android基础操作-----SuppressLint和SuppressWarnings
  20. C语言编程练习:打印九九口诀表

热门文章

  1. python exec函数_Python中的exec函数
  2. 在vue中使用videoJs实现前端视频流
  3. 安装配置绿色版MySQL5.6
  4. my ReadBook_love
  5. 第十一章 文件操作_C语言实现文件复制功能(包括文本文件和二进制文件)
  6. TP6集成JWT的步骤。
  7. 渗透测试-不死马的创建和查杀
  8. 保险私有云 IaaS 资源池选型与演进之路 | SmartX 客户实践
  9. 我的世界服务器怎么显示腐竹来了,我的世界服务器主人可用指令一览 我的世界腐竹常用指令介绍_游侠手游...
  10. Hue 集成Hive