DRF 路由层

2024-04-22 03:12
文章标签 路由 drf

本文主要是介绍DRF 路由层,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

路由层

【1】原始路由

(1)正则re_path

from django.urls import path, re_path
from book import viewsurlpatterns = [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 viewsurlpatterns = [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, includeurlpatterns = [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, includerouter = 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 ViewSetclass 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': '修改成功'})

这篇关于DRF 路由层的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/924696

相关文章

【vue3|第28期】 Vue3 + Vue Router:探索路由重定向的使用与作用

日期:2024年9月8日 作者:Commas 签名:(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释:如果您觉在这里插入代码片得有所帮助,帮忙点个赞,也可以关注我,我们一起成长;如果有不对的地方,还望各位大佬不吝赐教,谢谢^ - ^ 1.01365 = 37.7834;0.99365 = 0.0255 1.02365 = 1377.4083;0.98365 = 0.0006 说

HCIA--实验十:路由的递归特性

递归路由的理解 一、实验内容 1.需求/要求: 使用4台路由器,在AR1和AR4上分别配置一个LOOPBACK接口,根据路由的递归特性,写一系列的静态路由实现让1.1.1.1和4.4.4.4的双向通信。 二、实验过程 1.拓扑图: 2.步骤: (下列命令行可以直接复制在ensp) 1.如拓扑图所示,配置各路由器的基本信息: 各接口的ip地址及子网掩码,给AR1和AR4分别配置

微信小程序路由跳转之间的区别

navigateTo: 功能描述: navigateTo用于保留当前页面,跳转到应用内的某个页面。但是不能跳到 tabbar 页面。 页面栈变化: 当使用navigateTo进行页面跳转时,当前页面会被推入页面栈中,但不会被销毁,新页面则显示在屏幕上。因此,页面栈中的元素数量会增加。 注意:一般定制返回时候不要用navigateTo,用navigateBack,否则会导致页面栈过多。 nav

如何为 DigitalOcean 静态路由操作员设置故障转移

静态路由操作器的主要目的是提供更大的灵活性,并在 Kubernetes 环境中控制网络流量。它使你能够根据应用程序的需求自定义路由配置,从而优化网络性能。该操作器作为 DaemonSet 部署,因此将在你的 DigitalOcean Managed Kubernetes 集群的每个节点上运行。 在本教程中,你将学习如何根据 CRD 规范管理每个工作节点的路由表,并设置故障转移网关。

若依框架登录鉴权详解(动态路由)

若依框架登录鉴权:1.获取token(过期在响应拦截器中实现),2.基于RBAC模型获取用户、角色和权限信息(在路由前置守卫),3.根据用户权限动态生成(从字符串->组件,根据permission添加动态路由信息)和添加路由addRoutes(在路由前置守卫) 若依框架(Ruoyi)后端的登录权限身份认证流程是一个复杂但高效的过程,它确保了系统的安全性和数据的保护。以下是一个典型的若依

Vue - 关于Router路由跳转时显示的animate.css动画

Vue - 关于Router路由跳转时显示的animate.css动画 在Vue中,操作路由跳转时页面是闪白的,没有动画效果,我们可以通过在router-view中设置transition,并搭配animate丰富的动画效果来美化路由跳转时的显示效果. 1.安装animate npm i -S animate.css 2.在main中引入animate.css import 'anim

Avoided redundant navigation to current location: 路由相同报错

vue-router有一个内置保护机制,它会阻止不必要的重复导航,以提高性能并避免不必要的计算。 具体来说,错误信息中的就是试图访问的路径时,应用程序已经在当前这个路径上。因此,vue-router检测到了这个重复的导航请求,就发出了警告。 通常情况下,这种警告并不需要特别处理,因为这只是一个优化措施,防止不必要的导航。但是如果你频繁遇到这种情况,可能需要检查触发导航的部分代码逻辑是否有必要进

直接路由配置集群通信---------通过quagga 动态添加服务器路由规则

上一篇微博提到关于使用直接路由的方式配置集群通信,其优点很明确,简单易懂,但是缺点也是不容忽视的。假设一下,你的集群里面有100甚至是上千个node,在每个服务器上,你都得去配置到其他所有node的静态路由,其工作量是庞大切枯燥的。 这里我详细介绍一下,使用quagga来动态添加路由规则。软件主页http://www.quagga.net。 最简单的方式当然是直接在每台服务器上安装quagga

使用直接路由配置kubernetes 集群

通过在每个node 上添加其他node的docker0 网桥的静态路由规则,就可以实现docker0 网桥的互通了。 这种方法需要在每个node的路由表中增加到对方docker0 的静态路由规则,以下例子:      pod1 所在docker0网桥的ip子网10.1.10.0,该node 姑且叫做node1,其地址为192.168.1.128; pod2 所在docker0网桥的ip子网1

Vue的路由跳转

文章目录 基本语法1. **使用路径字符串跳转**2. **使用命名路由跳转**3. **传递参数****带路径参数****带查询参数****结合 `params` 和 `query`** 4. **替换导航 (replace)**5. **导航失败的处理**6. **返回上一页或前进**总结 this.$router.push() 是 Vue Router 提供的导航方法,用