drf 路由生成
前言
在drf中,我们写接口可以通过继承modelViewSet从而达到非常快速的功能实现,这十分的方便,但是modelViewSet由于需要根据不同的参数来对应不同的处理,所以我们写的url最少都需要两条,如下所示:
path('api/users/', views.UserAPI.as_view(actions={"get":"list","post":"create"})),
re_path('^api/users/(?P<uid>\d+)?',views.UserAPI.as_view(actions={"get":"retrieve","patch":"update","delete":"destroy"}))
有没有什么办法能够快速的生成两条url呢?其实是有的,但是在这之前我们也可以对他手动封装一个组件,达到自动生成路由的功能。
手动封装
下面是手动封装url的一个示例,首先url本身就是一个列表,所以我们的组件最终可以返回一个可迭代对象就行,直接将生成的url添加至已有的url列表中。
from django.contrib import admin
from django.urls import path, re_path
from app01 import views
from rest_framework.routers import SimpleRouter
class GenerateRouter:
def __init__(self):
self.urls = None
def register(self, prefix, viewset, basename=None):
# prefix 匹配规则,不用加 /
# viewset 继承自ModelViewSet视图类
# basename 别名
from django.urls import path, re_path
name = viewset.serializer_class.Meta.model.__name__.lower() # 获取查询的数据表名字
self.urls = (
re_path("^%s/$" % prefix, viewset.as_view(actions={"get": "list", "post": "create"}),
name=basename or name + "-list"), # 不需要参数,查全部和新增
re_path('^%s/(?P<%s>[^/.]+)/$' %(prefix,viewset.lookup_url_kwarg or "pk"), # 如果设置捕获字段,就用捕获字段,否则就用pk
viewset.as_view(
actions={"get": "retrieve", "patch": "update", "delete": "destroy", "put": "update"}),
name=basename or name + "-detail"),
)
router = GenerateRouter() # 实例化
router.register("api/users", views.UserAPI) # 注册
urlpatterns = [
path('admin/', admin.site.urls),
]
urlpatterns.extend(router.urls) # 添加
它生成的路由是这样子的:
^api/users/$ [name='user-list']
^api/users/(?P<uid>[^/.]+)/$ [name='user-detail']
router组件
简单路由
在drf中也提供了这样的组件,它可以帮助我们快速的生成路由。比我们上面自己封装的要强大一些,但是本质上都是一样的。
下面是简单使用,首先我们需要进行导入。
from rest_framework.routers import SimpleRouter
其次是对其进行实例化后注册一个路由信息。
def register(self, prefix, viewset, basename=None)
# prefix 匹配规则,不用加 /
# viewset 继承自ModelViewSet视图类
# basename 别名
from django.contrib import admin
from django.urls import path
from app01 import views
from rest_framework.routers import SimpleRouter # 第一步导入
router = SimpleRouter() # 第二步实例化
router.register("api/users", views.UserAPI) # 第三步注册路由
urlpatterns = [
path('admin/', admin.site.urls),
]
urlpatterns.extend(router.urls) # 第四步添加
它会自动生成两条url,这与我们上面的手动封装是一样的原理:
^api/users/$ [name='user-list']
^api/users/(?P<uid>[^/.]+)/$ [name='user-detail']
至于这里为什么是uid,这是因为我们的API中lookup_url_kwarg设置的就是uid。
可以看以下上面手动封装中,也是这么做的。
class UserAPI(ModelViewSet):
queryset = models.User.objects # 传入对象即可
serializer_class = ser.UserModelSerializers # 序列化类
lookup_field = "pk"
lookup_url_kwarg = "uid" # 由于捕获的是uid,需要声明
默认路由
简单的SimpleRouter()其实就足够我们用了,但是drf也提供了更高级的默认路由,它会生成六条url,但是基本没啥用。
from django.contrib import admin
from django.urls import path, re_path
from app01 import views
from rest_framework.routers import SimpleRouter
from rest_framework.routers import DefaultRouter
router = DefaultRouter()
router.register("api/users", views.UserAPI)
urlpatterns = [
path('admin/', admin.site.urls),
]
urlpatterns.extend(router.urls)
以下是生成的路由信息。
^api/users/$ [name='user-list']
^api/users\.(?P<format>[a-z0-9]+)/?$ [name='user-list']
^api/users/(?P<uid>[^/.]+)/$ [name='user-detail']
^api/users/(?P<uid>[^/.]+)\.(?P<format>[a-z0-9]+)/?$ [name='user-detail']
^$ [name='api-root']
^\.(?P<format>[a-z0-9]+)/?$ [name='api-root']
action装饰器
action干什么用?是为了给继承自ModelViewSet的视图类中定义的函数也添加路由。
from . import models
from . import ser
from rest_framework.decorators import action # 导入装饰器
from rest_framework.viewsets import ModelViewSet
from rest_framework.response import Response
class UserAPI(ModelViewSet):
queryset = models.User.objects.all() # 传入对象即可
serializer_class = ser.UserModelSerializers # 序列化类
lookup_field = "pk"
lookup_url_kwarg = "uid" # 由于捕获的是uid,需要声明
@action(methods=['GET','POST'],detail=True)
def customize(self,request,uid):
book=self.get_queryset()[:2] # 从0开始截取一条
serializer=self.get_serializer(book,many=True) # 只要是返回queryset对象,就需要many=True
return Response(serializer.data)
# action的执行会覆盖掉本身的get、post、patch等所执行的方法,如list,update,create等默认行为。
# methods代表请求方式,当有该种请求到来时,则执行该方法
# detail代表是否需要捕获参数,True则是捕获。捕获参数就是lookup_url_kwarg
生成的路由信息如下:
^api/users/(?P<uid>[^/.]+)/customize/$ [name='user-customize']
^api/users/(?P<uid>[^/.]+)/customize\.(?P<format>[a-z0-9]+)/?$ [name='user-customize']
drf 路由生成的更多相关文章
- DRF的路由生成类的使用
DRF路由生成类的使用 对于视图集ViewSet,我们除了可以自己手动指明请求方式与动作action之间的对应关系外,还可以使用Routers来帮助我们快速实现路由信息. REST framework ...
- Asp.Net MVC路由生成URL过程
这次谈一谈Asp.Net MVC中所学到的路由生成URL的相关技术,顺便提一提遇到的一些坑,真的是掉坑掉多了,也就习以为常了,大不了从坑里再爬出来.初学者,包括我,都以为,mvc的核心是模型视图控制器 ...
- drf路由分发、解析/渲染模块配置、使用admin、自动序列化配置
目录 drf路由分发配置 解析模块配置 渲染模块配置 浏览器渲染打开 浏览器渲染关闭 结论 drf使用后台admin drf序列化模块 serializers.py: views.py:单查群查 测试 ...
- 【DRF路由】
在urls.py文件中按照如下步骤写,即可正确使用DRF的内置路由. from .views import BookModel # 1. 导入我们的视图 from rest_framework.rou ...
- drf路由与认证
目录 一.路由 1 没有继承视图集的视图类 2 继承了视图集的视图类 3 继承自ModelViewSet的路由写法(自动生成) 二.认证 1 drf认证的源码分析 2 自定义认证类的使用 一.路由 三 ...
- drf路由组件(4星)
路由组件(4星) 路由Routers 对于视图集ViewSet, 我们除了可以自己手动指明请求方式与动作action之间的对应关系外,还可以使用Routers来帮助我们快速实现路由信息. REST f ...
- ASP.NET MVC API 路由生成规则
我们都知道调用ASP.NET MVC的某些API函数(诸如:Url.Action.RedirectToAction等)可以生成URL,ASP.NET MVC会根据调用API函数时传入的参数去匹配系统定 ...
- asp.net mvc 根据路由生成正确的url
假设存在这样一段路由配置: routes.MapRoute( name: "ProductList1_01", url: "pl/{bigSortId}_{smallSo ...
- 根据指定路由生成URL |Generating a URL from a Specific Route | 在视图中生成输出URL|高级路由特性
后面Length=5 是怎么出现的?
随机推荐
- 面试可能遇到的关联式容器(map、set等)相关问题
>>>. map与set的区别是什么,各有哪些优势? map中存储的数据是以键值对(key - value)形式并且通过排序(比较key,默认以 '<' 方式排序)存在的( ...
- 注解&反射
什么是注解 Annotation是从JDK5.0开始引入的新技术 Annotation的作用: 不是程序本身,可以对程序作出解释.(这一点和注释(comment)没什么区别) > 可以被其他程序 ...
- 基于python的webUI自动化-小白基础篇
最近打算研究一下基于python的webUI自动化,先自学了一下相关基础知识,大概用了一个多月的时间,主要是找视频,一边看视频或者文档一边对照着敲代码运行. 重点强调:一定要一边看一边对照着敲代码运行 ...
- Python-序列反转和序列反转协议-reversed __reversed__
reversed 将序列反转,依次把最后的元素放到第一个位置,把第一元素放到最后一个位置,变成生成器对象 name = "beimenchuixue" print(next(rev ...
- Python-变量、变量作用域、垃圾回收机制原理-global nonlocal
变量实现原理决定了Python使用的垃圾回收机制为变量引用计数,当这个对象引用计数为0时候,则会自动执行__del__函数回收资源, del方法只是把变量指向的对象引用计数减一而已并删除这个变量 表达 ...
- Centos-bash-4.1$
错误: -bash-4.1$ where? 登录Centos时候,会显示4行这样的错误信息-bash-4.1$ why? 1. 该用户家目录缺少 .bashrc .bash_logout .base_ ...
- Linux I2C驱动框架
Linux的I2C体系结构分为3个组成部分: I2C核心( i2c-core.c ): I2C核心提供了I2C总线驱动和设备驱动的注册.注销方法.I2C通信方法("algorithm&qu ...
- 可变参数__VA_ARGS__使用
1. 调试功能一般会使用到宏+可变参数的方式 1.1 ##__VA_ARGS__ 之详细解析 例如: case A. #define my_print1(...) printf(__V ...
- LeetCode刷题总结-动态规划篇
本文总结LeetCode上有动态规划的算法题,推荐刷题总数为54道.具体考点分析如下图: 1.中心扩展法 题号:132. 分割回文串 II,难度困难 2.背包问题 题号:140. 单词拆分 II,难度 ...
- matlab中的qr函数
转自:https://blog.csdn.net/qq278672818/article/details/62038630 实数矩阵A的QR分解是把A分解为 A = QR 这里的Q是正交矩阵(意味着Q ...