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 是怎么出现的?
随机推荐
- matlab receive License Manager Error -103?
参考:https://www.mathworks.com/matlabcentral/answers/91874-why-do-i-receive-license-manager-error-103 ...
- spring-boot-route(九)整合JPA操作数据库
单调的增删改查让越来越多的程序员感到乏味,这时候就出现了很多优秀的框架,完成了对增删改查操作的封装,只需要简单配置,无需书写任何sql,就可以完成增删改查.这里比较推荐的是Spring Data Jp ...
- 联赛模拟测试12 B. trade
题目描述 分析 \(n^2\) 的 \(dp\) 应该比较好想 设 \(f[i][j]\) 为当前在第 \(i\) 天剩余的货物数量为 \(j\) 时的最大收益 那么它可以由 \(f[i-1][j]\ ...
- Python 疑难问题:[] 与 list() 哪个快?为什么快?快多少呢?
本文出自"Python为什么"系列,请查看全部文章 在日常使用 Python 时,我们经常需要创建一个列表,相信大家都很熟练了吧? # 方法一:使用成对的方括号语法 list_a ...
- 自定义chrome新标签页
[跳转GitHub] chromeNewTab 自定义chrome新标签页.由于不想发布到chrome应用商店,因此搜了一下不用开发者模式就能用的方法. 使用说明 下载chrome的一个[window ...
- 基于SpringAop的鉴权功能
什么是 AOP 首先我们先了解一下什么是AOP,AOP(Aspect Orient Programming),直译过来就是面向切面编程.AOP是一种编程思想,是面向对象编程(OOP)的一种补充.面向对 ...
- 无法访问GitHub
我们开发者经常用的最大的同性交流平台--GitHub忽然访问不了了,很尴尬 可以打开控制台 ping一下 github.com 果不其然 不通 不过幸运的是里面有github的ip地址,好像是美国某个 ...
- spring boot:方法中使用try...catch导致@Transactional事务无效的解决(spring boot 2.3.4)
一,方法中使用try...catch导致@Transactional事务无效的解决方法 1,问题的描述: 如果一个方法添加了@Transactional注解声明事务, 而方法内又使用了try catc ...
- gin+gorm 用户服务
package main import ( "fmt" "github.com/gin-gonic/gin" "github.com/jinzhu/g ...
- Go go.mod入门
什么是go.mod? Go.mod是Golang1.11版本新引入的官方包管理工具用于解决之前没有地方记录依赖包具体版本的问题,方便依赖包的管理. Go.mod其实就是一个Modules,关于Modu ...