当前位置: 首页 > news >正文

【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 视图集,添加自定义操作,以满足特定的业务需求。

相关文章:

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

文章目录 【Django】 Task5 DefaultRouter路由组件和自定义函数1.路由组件1.1路由组件介绍1.2SimpleRouter1.3DefaultRouter1.4DefaultRouter示例1.5查看访问服务接口url 2.自定义函数 【Django】 Task5 DefaultRouter路由组件和自定义函数 Task5 主要了解了DefaultRouter路由…...

Git拉取分支、基于主分支创建新的开发分支、合并开发分支到主分支、回退上一次的merge操作

系列文章目录 第1章 Git拉取分支、基于主分支创建新的开发分支、合并开发分支到主分支、回退上一次的merge操作 文章目录 系列文章目录一、拉取分支二、如何从master分支创建一个dev分支三、如何将dev分支合并到master分支四、如何回退上一次的merge 一、拉取分支 项目文件夹…...

SpringBoot实现定时任务操作及cron在线生成器

spring根据定时任务的特征,将定时任务的开发简化到了极致。怎么说呢?要做定时任务总要告诉容器有这功能吧,然后定时执行什么任务直接告诉对应的bean什么时间执行就行了,就这么简单,一起来看怎么做 步骤①:…...

数据结构(Java实现)-栈和队列

栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。 先进后出 栈的使用 栈的模拟实现 上述的主要代码 public class MyStack {private int[] elem;private int usedSize;public MyStack() {this.elem new int[5];}Overridepublic …...

毕业季如何做好IT技术面试

在IT技术面试过程中,面试者需要展示多个方面的能力和素质,以确保其能够成功地适应公司的文化和环境,并为公司的发展做出贡献。本文将详细介绍IT技术面试的各个方面,并给出建议和指导。 简历和求职信 简历和求职信是面试官了解面…...

springcloud3 GateWay章节-Nacos+gateway(跨域,filter过滤等5

一 常用工具类 1.1 结构 1.2 跨域 Configuration public class CorsConfig {Beanpublic CorsWebFilter corsFilter() {CorsConfiguration config new CorsConfiguration();config.addAllowedMethod("*");config.addAllowedOrigin("*");config.addAllowe…...

Nodejs+Typescript+Eslint+Prettier+Husky项目构建

NodejsTypescriptEslintPrettierHusky项目构建 准备工作初始化项目Eslint安装和配置Prettier安装和配置在Eslint中使用Prettier插件Husky安装和配置修改tsconfig.json启用表示src目录 修改package.json设置vscode调试 仓库地址 准备工作 确保已经安装了git以及Node.js和npm&a…...

轻松正确使用代理IP

Hey,亲爱的程序员小伙伴们!在进行爬虫时,你是否曾使用过别人的代理IP?是否因此慌乱,担心涉及违法问题?不要惊慌!今天我将和你一起揭开法律迷雾,为你的爬虫之路保驾护航。快跟上我的节…...

SpringCloud教程 | 第二篇: 服务消费者(rest+ribbon)

在上一篇文章,讲了服务的注册和发现。在微服务架构中,业务都会被拆分成一个独立的服务,服务与服务的通讯是基于http restful的。Spring cloud有两种服务调用方式,一种是ribbonrestTemplate,另一种是feign。在这一篇文章…...

lintcode 961 · 设计日志存储系统预【系统设计题 中等】

题目链接,描述 https://www.lintcode.com/problem/961 您将获得多个日志,每个日志都包含唯一的 ID 和时间戳。 时间戳是一个具有以下格式的字符串:Year:Month:Day:Hour:Minute:Second,例如2017:01:01:23:59:59。 所有域都是零填…...

windows下Qt、MinGW、libmodbus源码方式的移植与使用

windows下Qt、MinGW、libmodbus源码方式的移植与使用 1、前言 libmodbus官网:https://libmodbus.org/ github下载:https://github.com/stephane/libmodbus 截止2023年8月26日时,libmodbus最新版本为3.1.10,本篇博客基于此版本进…...

leetcode做题笔记104. 二叉树的最大深度

给定一个二叉树 root ,返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 思路一:递归 int dfs(struct TreeNode* node){int rdepth 1;int ldepth 1;if(node->left!NULL) ldepth rdepth dfs(node->lef…...

【Luniux】解决Ubuntu外接显示器不显示的问题

Luniux】解决Ubuntu外接显示器不显示的问题 文章目录 Luniux】解决Ubuntu外接显示器不显示的问题1. 检查nvidia显卡驱动是否正常2. 更新驱动3. 检查显示器是否能检测到Reference 1. 检查nvidia显卡驱动是否正常 使用命令行 nvidia-smi来检查显卡驱动是否正常,如果…...

【C++初阶】模拟实现list

👦个人主页:Weraphael ✍🏻作者简介:目前学习C和算法 ✈️专栏:C航路 🐋 希望大家多多支持,咱一起进步!😁 如果文章对你有帮助的话 欢迎 评论💬 点赞&#x1…...

三维模拟推演电子沙盘虚拟数字沙盘开发教程第13课

三维模拟推演电子沙盘虚拟数字沙盘开发教程第13课 该数据库中只提供 成都市火车南站附近的数据请注意,104.0648,30.61658 在SDK中为了方便三方数据的接入,引入了一个用户层接口。主要是完成三方数据的接入,含动态数据(如GPS&…...

flask中GET和POST的区别

GET和POST是HTTP协议中两种常用的请求方法,它们在如何向服务器发送数据以及数据传输方式上有所不同。下面是GET和POST的主要区别: 一、数据传输位置: GET:将数据通过URL的查询字符串部分(即URL的参数)传递…...

基于Spring Boot的游泳馆管理系统的设计与实现(Java+spring boot+MySQL)

获取源码或者论文请私信博主 演示视频: 基于Spring Boot的游泳馆管理系统的设计与实现(Javaspring bootMySQL) 使用技术: 前端:html css javascript jQuery ajax thymeleaf 微信小程序 后端:Java spring…...

git冲突处理(已commit但忘pull的情况)

一般来说,你只要记得先拉再传就不会有问题,但如果pull后没有立刻push,这段时间刚好有人push了,就会导致冲突,那么你可以使用以下方法进行版本回退之后合并代码 步骤: git log查看所有的commit&#xff0c…...

嵌入式设备应用开发(发现需求和提升价值)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 很多做技术的同学,都会陷入到技术的窠臼之中。对于如何做具体的产品、实现具体的技术,他们可能很感兴趣。但是做出来的东西做什么用,或者说是有没有竞争力,事实上他们不是很关心…...

Redis Replication

Redis Replication 1、前言 在单节点搞事情, 存在的问题包括存量问题和增量问题两类, 解决方案就是1个不行上N个, 做到单机维度宕机但服务维度是可用的。 1.1 存量问题 如果目前的单节点QPS满足(也就是综合瓶颈还没达到), 那么只有宕机能影响到。如果业务量不大, 又是出于成…...

微信小程序之bind和catch

这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡&#xff0c;轻快的音乐在耳边持续回荡&#xff0c;小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下&#xff0c;六一来了。 今天是六一儿童节&#xff0c;小蓝老师为了让大家在节…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式&#xff08;Python 实现&#xff09; 在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是&#xff0c;.doc 是旧的 Word 格式&#xff0c;而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

基于 TAPD 进行项目管理

起因 自己写了个小工具&#xff0c;仓库用的Github。之前在用markdown进行需求管理&#xff0c;现在随着功能的增加&#xff0c;感觉有点难以管理了&#xff0c;所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD&#xff0c;需要提供一个企业名新建一个项目&#…...

Kafka入门-生产者

生产者 生产者发送流程&#xff1a; 延迟时间为0ms时&#xff0c;也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于&#xff1a;异步发送不需要等待结果&#xff0c;同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...

GitFlow 工作模式(详解)

今天再学项目的过程中遇到使用gitflow模式管理代码&#xff0c;因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存&#xff0c;无论是github还是gittee&#xff0c;都是一种基于git去保存代码的形式&#xff0c;这样保存代码…...