DRF 路由层

news2024/9/30 7:22:57

路由层

【1】原始路由

(1)正则re_path

from django.urls import path, re_path
from book import views

urlpatterns = [
    re_path(r'book/(?P<pk>\d+)?/?$', views.BookAPIView.as_view(), name='book')
]    
  • 示例解释

    • (?P<pk>\d+)是一个命名正则表达式组,它匹配一个或多个数字,并将匹配到的数字作为pk参数传递给视图函数或视图类。

    • 问号?表示这个部分是可选的,所以URL可以是book/book/123/

(2)路径转换器

  • 简单介绍:
    • int:捕获一个整数。
    • str:捕获一个字符串,直到遇到下一个斜杠为止。
    • slug:捕获一个由 ASCII 字母、数字、连字符或下划线组成的字符串。
    • uuid:捕获一个 UUID。
    • path:捕获整个 URL 路径片段,包括斜杠。
from django.urls import path
from book import views

urlpatterns = [
    path('book/', views.BookAPIView.as_view(), name='book'),
	path('book/<int:pk>/', views.BookOneAPIView.as_view(), name='bookOne'),
]
  • 示例解释
    • <int:pk>是一个路径转换器,它匹配一个整数,并将这个整数作为pk参数传递给视图函数或视图类。
    • 这种写法比使用正则表达式更清晰、更易读。

【2】drf路由写法

(1)手写actions

  • 在视图集中,只要继承了ViewSetMixin,那么就都需要在as_view中传递参数actions
from book.views import BookViewSet
from django.urls import path, include

urlpatterns = [
    path('book/', views.BookAPIView.as_view({'get': 'list', 'post': 'create'})),
    path('book/<int:pk>/', views.BookAPIView.as_view({'get': 'retrieve', 'put': 'update', 'delete': 'destroy'})),
]
  • 在上面的例子中,BookAPIView是一个继承自ViewSetMixin的视图类。
  • 通过调用as_view()方法并传入一个字典,可以指定每个HTTP方法应该调用的视图集中的哪个动作。
    • 例如,{'get': 'list', 'post': 'create'}表示当使用GET方法访问/book/路径时,将调用BookAPIView中的list动作;当使用POST方法时,将调用create动作。

(2)自动生成router

  • 自动生成router的方式通过使用DRF提供的路由器(如DefaultRouterSimpleRouter),可以大大简化URL的配置过程。
  • 示例:针对上面同样的情况使用SimpleRouter
from rest_framework.routers import SimpleRouter
from book.views import BookViewSet
from django.urls import path, include

router = SimpleRouter()
router.register(prefix='book', viewset=UserAPIView, basename='book')
urlpatterns += router.urls

image-20240416172216847

  • 参数讲解
  • prefix:用于设置生成 URL 的前缀。
  • viewset:视图集(ViewSet)的实例或者类,应该继承自 rest_framework.viewsets.ViewSet 或其子类(如 ModelViewSet
  • basename:用于生成 URL 名称,在反向解析 URL 时会用到。

(3)加入到路由的两种方式

  • urlpatterns += router.urls
    • 将路由器生成的URL列表直接追加到现有的urlpatterns列表中。
    • 这通常在你已经有了一些手动定义的URL模式,并且想要将路由器生成的URL模式追加到它们之后时使用。
  • path("", include(router.urls))
    • 将路由器生成的URL模式包含在一个特定的路径下。
    • 想要将一组相关的API端点组织在一个共同的URL前缀下时非常有用。只需要在path的第一个参数中添加前缀就可以

(4)SimpleRouterDefaultRouter

  • 相同点

    1. 自动生成URL:两者都能根据视图集中的方法自动生成对应的URL模式,无需手动编写每个URL。
    2. 提供视图集注册:通过router.register()方法,可以将视图集注册到路由器上,从而生成对应的URL。
  • 不同点

    • 根视图和API界面

      • DefaultRouter:除了为视图集中的每个操作生成URL之外,还会提供一个自动生成的API根视图和可浏览的API界面。这使得开发者可以更容易地查看和测试API。
      • SimpleRouter:只生成与视图集操作对应的URL,不提供自动生成的API根视图和可浏览的API界面。
    • 路由URL数量

      • 由于DefaultRouter提供了额外的根视图和API界面,因此生成的URL数量会比SimpleRouter多。
    • 使用场景

      • DefaultRouter:适用于需要提供一个完整且可浏览的API界面的场景,如开发API供外部调用或内部调试。
      • SimpleRouter:适用于只需要基本的URL映射,而不需要额外API界面的场景,或者当开发者希望减少生成的URL数量以提高性能时。
  • 路径不同

print(router.urls)
# SimpleRouter
# [<URLPattern '^book/$' [name='book-list']>, <URLPattern '^book/(?P<pk>[^/.]+)/$' [name='book-detail']>]
# DefaultRouter
# [<URLPattern '^book/$' [name='book-list']>, <URLPattern '^book\.(?P<format>[a-z0-9]+)/?$' [name='book-list']>, <URLPattern '^book/(?P<pk>[^/.]+)/$' [name='book-detail']>, <URLPattern '^book/(?P<pk>[^/.]+)\.(?P<format>[a-z0-9]+)/?$' [name='book-detail']>, <URLPattern '' [name='api-root']>, <URLPattern '<drf_format_suffix:format>' [name='api-root']>]

image-20240416183459877

【3】aciton装饰器

  • 首先要强调的是必须继承ViewSetMixin的视图类才可以使用

(1)介绍

  • @action装饰器是一个用于在视图集中添加自定义路由和视图方法的强大工具。
  • 语法:@action(detail=False, methods=['get'], url_path='custom-list')
    • detail参数:这个参数决定了该动作是否针对单个实例(True)还是针对集合(False)。
      • 如果detail=True,则URL将包含对象的主键,例如/myendpoint/{pk}/custom-detail/
      • 如果detail=False,则URL将不包含主键,例如/myendpoint/custom-list/
    • methods参数:这个参数是一个列表,指定了支持哪些HTTP方法(如['get'], ['post'], ['put']等)。
    • url_path参数:这个参数是自定义路由的URL部分,它将附加到视图集的URL上。默认是方法名。

(2)示例

  • 要求:在一个视图类中完成登录、注册、修改密码的接口

image-20240416192458403

  • 代码
from rest_framework.viewsets import ViewSet


class UserAPIView(ViewSet):

    @action(methods=['post'], detail=False)
    def register(self, request):
        return Response({'code': 100, 'msg': '注册成功'})

    @action(methods=['post'], detail=False)
    def login(self, request):
        return Response({'code': 100, 'msg': '登录成功'})

    @action(methods=['post'], detail=False)
    def password(self, request):
        return Response({'code': 100, 'msg': '修改成功'})

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用mmsegmentaion遇到的问题

利用mmsegmentaion跑自定义数据集时的bug处理&#xff08;使用bisenetV2&#xff09; 1. ValueError: val_dataloader, val_cfg, and val_evaluator should be either all None or not None, but got val_dataloader{batch_size: 1, num_workers: 4}, val_cfg{type: ValLoop}, …

c++ 线性搜索与二分搜索

线性搜索 假设该项目以随机顺序存在于数组中&#xff0c;并且我们必须找到一个项目。那么搜索目标项目的唯一方法就是从第一个位置开始&#xff0c;并将其与目标进行比较。如果项目相同&#xff0c;我们将返回当前项目的位置。否则&#xff0c;我们将转移到下一个位置。…

在Qt creator中使用多光标

2024年4月22日&#xff0c;周一下午 Qt Creator 支持多光标模式。 多光标模式允许你在同一时间在多个光标位置进行编辑&#xff0c;从而可以更快地进行一些重复性的编辑操作。 要启用多光标模式&#xff0c;请按住 Alt 键&#xff0c;并用鼠标左键在文本编辑器中选择多个光标…

恒创科技:网站更改域名对seo的影响大吗?

众所周知&#xff0c;搜索引擎优化 (SEO) 对于增加网站的自然流量、提高转化率以及提高品牌知名度至关重要。所以&#xff0c;网站在进行更改域名时&#xff0c;我们应当关注其对 SEO 的影响。 网站更改域名对 SEO 影响大吗? 更改域名会更改网站上每个页面的 URL &#xff0c;…

SpringSecurity初探(一)

认证:知道你是谁 授权:你能干什么 创建SpringBoot应用,引入web和security <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency><group…

Redis数据类型——String

Redis官网指令文档&#xff1a;Commands | Docs 前言 此处的String类型是针对Redis的Value的&#xff0c;因为Key的形式都是String&#xff0c;而Value则有哈性、列表、集合等形式。 众所周知&#xff0c;由于不同编码&#xff0c;经常会出现乱码的问题&#xff0c;但在Redi…

代码签名的定义、重要性及其应用实例

代码签名证书&#xff0c;简单来说&#xff0c;是一种数字证书&#xff0c;用于验证软件开发者身份以及软件代码的完整性和未被篡改。在软件开发和分发过程中&#xff0c;代码签名证书扮演着至关重要的角色&#xff0c;它为用户提供了信任保证&#xff0c;确保所下载和安装的软…

Quarto Dashboards 教程 2:Dashboard Layout

「写在前面」 学习一个软件最好的方法就是啃它的官方文档。本着自己学习、分享他人的态度&#xff0c;分享官方文档的中文教程。软件可能随时更新&#xff0c;建议配合官方文档一起阅读。推荐先按顺序阅读往期内容&#xff1a; 1.quarto 教程 1&#xff1a;Hello, Quarto 2.qu…

vue ant form validate如何对数组下的表单校验

问题 使用Ant Design Vue校验表单时&#xff0c;通过validateFields&#xff0c;但是如何一个数组内部的校验呢&#xff1f; 效果图&#xff1a; 实现方式&#xff1a; 通过 v-for 循环渲染:name"[]"实现&#xff0c;我们直接看代码。 <template><a-for…

vue3组件之间的传参

1、父传子 defineProps 父组件 <script setup>import { reactive } from vue;import Children from ./children.vue;const parentProps reactive({name:zhangsan,age:20})</script><template><div>这是父组件</div><div>子组件:<Chil…

空间数据索引的利器:R-Tree原理与实现深度解析

空间数据索引的利器&#xff1a;R-Tree原理与实现深度解析 R-Tree的原理插入操作分裂操作查询操作 R-Tree的伪代码R-Tree的C语言实现讨论结论 R-Tree是一种平衡树&#xff0c;用于空间数据索引&#xff0c;特别是在二维或更高维度的几何对象存储和检索中。它由Antony Guttman和…

万益蓝Wonderlab益生菌:吃雪糕的自由,我终于找回来了!

虽然现在不是夏天&#xff0c;但是我必须要来说一下&#xff01;我不仅在夏天可以吃雪糕&#xff01;冬天吃也完全没有问题&#xff01; 夏天&#xff0c;对于很多人来说&#xff0c;是雪糕、冷饮和冰镇西瓜的代名词。但对于我&#xff0c;这简直就是个“禁区”。每次看着别人…

ACS510-01-157A-4 3ABD00015756-D通用变频器

商业别名:ACS510-01-157A-4 产品ID:3ABD00015756-D ABB型号名称:ACS510-01-157A-4 目录说明:ACS510-01-157A-4,157A,380V,IP21 详细描述:ACS510-01-157A-4,157A,380V,IP21 原产地:China (CN) 海关关税号:85044099 发票说明:ACS510-01-157A-4,157A,380V,IP21 按订单生产:No 最小…

农业四情监测系统:科技助力农业智慧化

【MQ-4NYSQ】农业四情监测系统&#xff0c;依托农业物联网环境传感器&#xff0c;精准捕捉苗田苗情、土壤墒情、苗田灾情以及苗田病虫草情&#xff0c;为现代农业生产提供了有力支持。 传统的苗情监测往往依赖人工手动记录与上报&#xff0c;这种方式不仅效率低下&#xff0c;…

【深度学习实战(8)】如何绘制loss曲线图

一、步骤 我们先定义一个dict&#xff0c;每一个key对应的value都是一个list。 loss_history dict((k, []) for k in ["epoch", "train_loss", "val_loss"])每一轮或者每一次迭代的损失都通过list记录下来。 loss_history["epoch"…

Task01:初识深度学习

学习视频&#xff1a; 深度学习介绍_哔哩哔哩_bilibili 03 安装【动手学深度学习v2】_哔哩哔哩_bilibili 02 深度学习介绍【动手学深度学习v2】 x轴&#xff1a;不同的模式 y轴&#xff1a;“我”想做的东西 计算机视觉中是像素&#xff0c;很难用符号表示&#xff0c;所以…

Meta通过开源Llama 3 LLM提高了标准

Meta 推出了 Llama 3,这是其最先进的开源大型语言模型(LLM)的下一代产品。这家科技巨头声称,Llama 3 在现实场景中建立了新的性能基准,超越了之前行业领先的模型,如 GPT-3.5。 Meta 在一篇博文中宣布了这一发布,并表示:"通过 Llama 3,我们致力于打造与当今最好的专有模型…

qt实现不定数量的按钮向前向后移动展示

按钮模拟移动 引言示例代码第一种思路开发环境代码结构实现代码第二种思路开发环境实现代码第三种思路开发环境实现代码总结引言 此文主要记录用qt实现按钮的移动,具体效果如下: 模拟按钮移动效果 示例代码 本文记录了三种实现方式。 第一种 思路 用动态数组vector存放创…

系统调优助手,PyTorch Profiler TensorBoard 插件教程

0x1. 前言 使用PyTorch Profiler进行性能分析已经一段时间了&#xff0c;毕竟是PyTorch提供的原生profile工具&#xff0c;个人感觉做系统性能分析时感觉比Nsys更方便一些&#xff0c;并且画的图也比较直观。这里翻译一下PyTorch Profiler TensorBoard Plugin的教程并分享一些…

边缘计算网关的工业设备数据采集方案-天拓四方

随着工业4.0时代的到来&#xff0c;工业设备数据采集成为了实现智能制造、提升生产效率的关键环节。传统的数据采集方案往往依赖于中心化的数据处理方式&#xff0c;但这种方式在面对海量数据、实时性要求高的工业场景时&#xff0c;往往显得力不从心。因此&#xff0c;利用边缘…