【Django】 Task5 DefaultRouter路由组件和自定义函数

文章目录

  • 【Django】 Task5 DefaultRouter路由组件和自定义函数
    • 1.路由组件
      • 1.1路由组件介绍
      • 1.2SimpleRouter
      • 1.3DefaultRouter
      • 1.4DefaultRouter示例
      • 1.5查看访问服务接口url
    • 2.自定义函数

【Django】 Task5 DefaultRouter路由组件和自定义函数

Task5 主要了解了DefaultRouter路由组件,Django REST framework(DRF)是一个强大且灵活的 Django 插件,用于开发 Web API。并且掌握通过@action进行自定义函数。

写在最后

  愉快的打卡时间过得飞快,再次感谢DataWhale全体工作人员的辛勤付出,让我们聚在一块学习、一块进步、一块成长,笔芯~

  在这次活动中也认识了很多有趣的小伙伴,队长Puppet总是在群里第一时间分享自己的学习博客,总是提醒我们记得打卡,蟹蟹队长。也认识了超爱学习的小蜗牛,短短几个小时的交流过程中,发现她有对问题思考、并且学习态度一丝不苟,凌晨两点多还在写博客总结学习笔记。

  终点很远,坚定前行,感受沿途风景,最后会有收获的。

                         ——cheunghonghui
                           2023.08.22

在这里插入图片描述

1.路由组件

1.1路由组件介绍

Django REST framework(DRF)是一个强大且灵活的 Django 插件,用于开发 Web API。它提供了一系列工具和组件,帮助您轻松地构建、发布和管理 API。其中,路由组件是 DRF 的一个关键特性,用于将视图函数映射到 URL,使得 API 的 URL 结构更加清晰和可维护。

DRF 的路由组件主要由两个类组成:SimpleRouter 和 DefaultRouter。这些类使您能够自动生成 URL 配置,而无需手动编写 URL 模式。

使用这些路由器,您可以将视图集映射到 URL,从而定义 API 的 URL 结构。Django REST framework 会自动为每个视图集生成适当的 URL 模式,减少了手动配置 URL 的工作。

总之,Django REST framework 的路由组件是一种用于管理 API URL 结构的强大工具,它能够根据视图集自动生成 URL 配置,使得 API 的开发变得更加高效和可维护。

1.2SimpleRouter

SimpleRouter: SimpleRouter 是一个基本的路由器,用于自动生成 CRUD(创建、读取、更新、删除)操作的 URL 配置。您只需将视图集类传递给路由器,它将自动生成适当的 URL 配置。

from rest_framework.routers import SimpleRouter
from .views import BookViewSetrouter = SimpleRouter()
router.register(r'books', BookViewSet)urlpatterns = router.urls

1.3DefaultRouter

DefaultRouter: DefaultRouter 是一个稍微高级的路由器,除了 CRUD 操作,它还支持额外的路由配置,如 list, create, retrieve, update, partial_update, destroy 和自定义操作。它还提供了根视图和 API 登录视图。

from rest_framework.routers import DefaultRouter
from .views import BookViewSetrouter = DefaultRouter()
router.register(r'books', BookViewSet)urlpatterns = router.urls

1.4DefaultRouter示例

使用 DefaultRouter 时,它会自动生成一组默认的 URL 配置,涵盖了视图集中的 CRUD 操作以及一些额外的自定义操作。以下是使用 DefaultRouter 后生成的默认 URL 访问方式:

假设我们有一个 BookViewSet 视图集,用于处理图书数据:

from rest_framework import viewsets
from .models import Book
from .serializers import BookSerializerclass BookViewSet(viewsets.ModelViewSet):queryset = Book.objects.all()serializer_class = BookSerializer

通过使用 DefaultRouter 将 BookViewSet 注册到路由器中:

from rest_framework.routers import DefaultRouter
from .views import BookViewSetrouter = DefaultRouter()
router.register(r'books', BookViewSet)

生成的默认 URL 访问方式如下:

列表(List): 列出所有图书URL:/books/
方法:GET
视图函数:list()
创建(Create): 创建新图书URL:/books/
方法:POST
视图函数:create()
详情(Retrieve): 获取单个图书的详细信息URL:/books/{pk}/
方法:GET
视图函数:retrieve()
更新(Update): 更新图书的详细信息URL:/books/{pk}/
方法:PUT
视图函数:update()
部分更新(Partial Update): 部分更新图书的详细信息URL:/books/{pk}/
方法:PATCH
视图函数:partial_update()
删除(Destroy): 删除图书URL:/books/{pk}/
方法:DELETE
视图函数:destroy()

除了这些默认的 CRUD 操作外,还可以使用自定义操作,如 list, create, retrieve, update, partial_update, destroy 以及您在视图集中定义的其他自定义操作。这些操作的 URL 也会根据视图集的配置生成。

1.5查看访问服务接口url

在 Django 中,您可以从多个位置获取有关访问的 URL 的信息,特别是在使用 Django REST framework(DRF)创建 Web API 时。以下是一些常见的方法来了解 URL 信息:

路由配置文件: 在 Django 项目的主 urls.py 文件中,您可以查看路由配置以了解所有的 URL。这是定义 URL 路由和视图的地方。

Django REST framework 路由器: 如果在 DRF 中使用了路由器(如 DefaultRouter 或 SimpleRouter),它会自动生成 URL 配置。您可以在路由器的文档或代码中查找生成的 URL。

Django Debug Toolbar: 如果在开发环境中使用了 Django Debug Toolbar,它会显示每个请求的详细信息,包括访问的 URL 和执行的视图。

Django Shell: 您可以在 Django 的交互式 shell 中导入路由配置,并查看生成的 URL。例如,使用 reverse() 函数来查找 URL 的反向映射。

命令行工具: 如果使用 Django 的命令行工具来运行开发服务器,它通常会在控制台中显示正在监听的端口和 URL。

Django REST framework 的 API 浏览器: DRF 提供了一个内置的 API 浏览器,它可以让您通过 Web 界面浏览和测试 API。您可以在浏览器中查看 URL 和执行请求。

文档和注释: 有时,您可以从代码中的文档字符串、注释或文档中找到有关特定 URL 的信息。

总的来说,了解访问的 URL 可以通过查看路由配置、工具和文档等方式来实现。选择最适合您当前环境和需求的方法,以获取所需的 URL 信息。

2.自定义函数

在 Django REST framework(DRF)中,@action 装饰器用于在视图集(Viewset)中定义自定义的操作,这些操作不属于标准的 CRUD 操作(例如列表、创建、获取、更新、删除)。使用 @action 装饰器,您可以将额外的自定义操作添加到视图集中,从而实现特定的业务逻辑。

@action 装饰器的常见用法是在视图集中添加额外的 HTTP 方法,以处理特定的操作。这些自定义操作会映射到视图集的方法,并且可以通过 API 的 URL 进行访问。

以下是一个使用 @action 装饰器的简单示例:

from rest_framework.decorators import action
from rest_framework.response import Response
from rest_framework import viewsetsclass BookViewSet(viewsets.ModelViewSet):queryset = Book.objects.all()serializer_class = BookSerializer@action(detail=False, methods=['GET'])def popular_books(self, request):# Custom logic to retrieve popular bookspopular_books = self.queryset.filter(rating__gte=4)serializer = self.get_serializer(popular_books, many=True)return Response(serializer.data)

在这个示例中,popular_books 是一个自定义的操作,它会返回所有评分大于等于 4 的热门图书。通过将 @action 装饰器应用于视图函数上,我们可以将这个操作映射到视图集中,使其可以通过 /books/popular_books/ URL 进行访问。

在 @action 装饰器中,您可以使用以下参数:

  • detail:布尔值,指示操作是否应该针对单个对象(True)还是整个集合(False)。默认为 True。
  • methods:一个包含允许的 HTTP 方法的列表,如 [‘GET’, ‘POST’]。
  • url_path:自定义操作的 URL 路径部分。
  • url_name:自定义操作的 URL 名称。
    其他视图函数的参数,如 request 和 pk。
    通过 @action 装饰器,您可以轻松地扩展您的 DRF 视图集,添加自定义操作,以满足特定的业务需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/104416.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Data Redis

文章目录 Redis各种Java客户端Spring Data Redis使用方式操作字符串类型的数据操作哈希类型数据列表类型集合类型有序集合类型通用类型 Redis各种Java客户端 Java中如何操作redis,这里主讲IDEA中的框架Spring Data Redis来操作redis Jedis是官方推出的,…

ubuntu18.04复现yolo v8之最终章,realsenseD435i+yolo v8完美运行

背景:上一篇博客我们已经为复现yolov8配置好了环境,如果前面的工作顺利进行,我们已经完成了90%(学习类程序最难的是环境配置)。 接下来将正式下载yolov8的相关代码,以及进行realsenseD435i相机yolo v8的de…

微信小程序 echarts 画多个横向柱状图

然后是json {"usingComponents": {"ec-canvas": "../../common/ec-canvas/ec-canvas"},"navigationBarTitleText": "主题活动" } ec-canvas获取方式 在链接里下载代码 然后copy ec-canvas文件夹到自己的项目 https://gi…

八、pikachu之越权

文章目录 1、越权概述2、水平越权3、垂直越权 1、越权概述 如果使用A用户的权限去操作B用户的数据,A的权限小于B的权限,如果能够成功操作,则称之为越权操作。 越权漏洞形成的原因是后台使用了 不合理的权限校验规则导致的。 一般越权漏洞容易…

Python实现企业微信群告警

Python实现企业微信告警 1. 创建企业微信群机器人 1-1. 什么是企业微信群机器人? 企业微信群机器人是企业微信平台提供的一种功能,可以通过Webhook方式将消息发送到指定的企业微信群中。它可以用于自动化发送通知、告警等信息,实现监控和信…

如何利用SFTP协议远程实现更安全的文件传输 ——【内网穿透】

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《高效编程技巧》《cpolar》 ⛺️生活的理想,就是为了理想的生活! 文章目录 1. 安装openSSH1.1 安装SSH1.2 启动ssh 2. 安装cpolar2.1 配置termux服务 3. 远程SFTP连接配置3.1 查看生成的随机公…

jenkins Linux如何修改jenkins 默认的工作空间workspace

由于jenkins默认存放数据的目录是/var/lib/jenkins,一般这个var目录的磁盘空间很小的,就几十G,所以需要修改jenkins的默认工作空间workspace 环境 jenkins使用yum安装的 centos 7 正题 1 查看jenkins安装路径 [rootlocalhost jenkins_old_data]# rpm…

unity动画融合

1、抛砖引玉 在大型复杂的场景中,一定遇到过手在鼓掌,头在摇头,腿又是其他动作的要求,但是这些东西又不能做一起,因为有时候要把某个动画单独使用,这时候就用到了动画融合,利用动画状态机分层机…

股票预测和使用LSTM(长期-短期-记忆)的预测

一、说明 准确预测股市走势长期以来一直是投资者和交易员难以实现的目标。虽然多年来出现了无数的策略和模型,但有一种方法最近因其能够捕获历史数据中的复杂模式和依赖关系而获得了显着的关注:长短期记忆(LSTM)。利用深度学习的力…

Redis中的淘汰策略

前言 本文主要说明在Redis面临key过期和内存不足的情况时,可以采用什么策略进行解决问题。 Redis中是如何应对过期数据的 正如我们知道的Redis是基于内存的、单线程的一个中间件,在面对过期数据的时候,Redis并不会去直接把它从内存中进行剔…

【SpringCloud技术专题】「Gateway网关系列」(1)微服务网关服务的Gateway组件的原理介绍分析

为什么要有服务网关? 我们都知道在微服务架构中,系统会被拆分为很多个微服务。那么作为客户端要如何去调用这么多的微服务呢?难道要一个个的去调用吗?很显然这是不太实际的,我们需要有一个统一的接口与这些微服务打交道&#xf…

Java后端开发面试题——消息中间篇

RabbitMQ-如何保证消息不丢失 交换机持久化: Bean public DirectExchange simpleExchange(){// 三个参数:交换机名称、是否持久化、当没有queue与其绑定时是否自动删除 return new DirectExchange("simple.direct", true, false); }队列持久化…

大数据项目实战(安装准备)

一,搭建大数据集群环境 1.1安装准备 1.1.1虚拟机安装与克隆 1.虚拟机的安装和设置以及启动虚拟机并安装操作系统(以下仅供参考) 安装一台虚拟机主机名为:hadoop01的虚拟机备用 VMware虚拟机安装Linux教程(超详细)_vmware安装…

初始Netty

文章目录 目录 文章目录 前言 一、netty 总结 前言 认识netty 一、netty Netty是一个基于Java的高性能网络应用框架,用于快速开发可扩展的网络服务器和客户端。它提供了易于使用的抽象API,使开发人员能够轻松地构建各种网络应用程序,包括…

【Git】分支管理

文章目录 一、理解分支二、创建、切换、合并分支三、删除分支四、合并冲突五、合并模式六、分支策略七、bug分支八、强制删除分支 努力经营当下 直至未来明朗! 一、理解分支 HEAD指向的是master分支,master中指向的是最新一次的提交,也就是m…

消息中间件介绍

消息队列已经逐渐成为企业IT系统内部通信的核心手段。它具有低耦合、可靠投递、广播、流量控制、最终一致性等一系列功能,成为异步RPC的主要手段之一。当今市面上有很多主流的消息中间件,如ActiveMQ、RabbitMQ,Kafka,还有阿里巴巴…

ElementUI中的日历组件加载无效的问题

在ElementUI中提供了一个日历组件。在某些场景下还是比较有用的。只是在使用的时候会有些下坑&#xff0c;大家要注意下。   官网提供的信息比较简介。我们在引入到项目中使用的时候可以能会出现下面的错误提示。 Unknown custom element: <el-calendar> - did you …

Qt文件系统操作和文件的读写

一、文件操作类概述 QIODevice&#xff1a;所有输入输出设备的基础类 QFile&#xff1a;用于文件操作和文件数据读写的类QSaveFile&#xff1a;用于安全保存文件的类QTemporaryFile&#xff1a;用于创建临时文件的类QTcpSocket和QUdpSocket&#xff1a;分别实现了TCP和UDP的类…

再学http-为什么文件上传要转成Base64?

1 前言 最近在开发中遇到文件上传采用Base64的方式上传&#xff0c;记得以前刚开始学http上传文件的时候&#xff0c;都是通过content-type为multipart/form-data方式直接上传二进制文件&#xff0c;我们知道都通过网络传输最终只能传输二进制流&#xff0c;所以毫无疑问他们本…

C语言实例_双向链表增删改查

一、双向链表介绍 双向链表&#xff08;Doubly Linked List&#xff09;是一种常见的数据结构&#xff0c;在单链表的基础上增加了向前遍历的功能。与单向链表不同&#xff0c;双向链表的每个节点除了包含指向下一个节点的指针外&#xff0c;还包含指向前一个节点的指针。 作用…