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 是怎么出现的?
随机推荐
- iOS14 debug安装的带有flutter应用从桌面图标重新启动时闪退
刚刚升级遇到的问题,希望能够帮助到遇到相同问题的人. 用xcode12连接iOS设备调试安装应用 拔掉数据线 从桌面图标点击进入App必闪退 后来发现是flutter的原因,目前有下面两种个解决方案: ...
- Zookeeper 笔记小结
转自: https://www.cnblogs.com/raphael5200/p/5285583.html 1.Zookeeper的角色 » 领导者(leader),负责进行投票的发起和决议,更新 ...
- djano jwt 的使用
1.5 JWT:使用djangorestframework-jwt模块进行用户身份验证 安装: pip install djangorestframework-jwt 添加应用:pytho ...
- (转载)什么是B树?
本文转载自网络. 如有侵权,请联系处理!
- Python练习题 040:Project Euler 012:有超过500个因子的三角形数
本题来自 Project Euler 第12题:https://projecteuler.net/problem=12 # Project Euler: Problem 12: Highly divi ...
- makefile的隐式规则
target := exe source_code = hello.c OBJS = $(source_code:.c=.o) $(target):$(OBJS) gcc $^ -o $@ clean ...
- 大话Python类语义
类 物以类聚,人以群分,就是相同特征的人和事物会自动聚集在一起,核心驱动点就是具有相同特征或相类似的特征,我们把具有相同特征或相似特征的事物放在一起,被称为分类,把分类依据的特征称为类属性 计算机中分 ...
- TP5隐藏入口文件
1,进入根目录,打开public文件夹,里面有个.htaccess文件 2,将这段代码改成?s= 3,不修改该文件,想要隐藏入口文件则会报错 4,改了文件之后是 5,改了入口文件为了隐藏 .php
- devops-持续集成管理之SonarQube
1. devops-持续集成管理之SonarQube 1) 代码质量七宗罪 编码规范:是否遵守了编码规范,遵循了最佳实践. 潜在的BUG:可能在最坏情况下出现问题的代码,以及存在安全漏洞的代码. 文 ...
- async-await和Promise的关系
关于异步处理,ES5的回调使我们陷入地狱,ES6的Promise使我们脱离魔障,终于.ES7的async-await带我们走向光明.今天就来学习一下 async-await. 经常会看到有了 asyn ...