django DRF 路由集

 

 

# 路由集Routers

对于视图集ViewSet,我们除了可以自己手动指明请求方式与视图方法之间的对应关系外,还可以使用Routers来帮助我们快速实现路由信息。如果是非视图集,不需要使用路由集routers。

REST framework提供了两个router类,使用方式一致的。结果多一个或少一个根目录url地址的问题而已。

- **SimpleRouter** 线上运营项目
- **DefaultRouter** 本地开发,项目上线前

## 2.1 使用方法

1) 创建router对象,并注册视图集。

demo/urls.py,代码:

"""使用路由集给视图集生成url路由"""
from rest_framework.routers import DefaultRouter, SimpleRouter

# 实例化路由对象
router = SimpleRouter()
# 注册视图集[每次注册一个视图集类,就需要调用register]
router.register("students9", views.StuModelViewSet, basename="student9")
router.register("students10", views.StuModelViewSet, basename="students10")

# 所有被注册的实体集生成的路由信息,全部会被集中到router.urls路由列表中,所以我们要把urls拼接到urlpatterns
urlpatterns += router.urls

 

register(prefix, viewset, basename)

  • prefix 该视图集的路由前缀

  • viewset 视图集

  • basename 路由别名的前缀

如上述代码会形成的路由如下:

url: ^students9/$                             basename: students9-list
url: ^students9/(?P<pk>[^/.]+)/$   basename: students9-detail

2)把路由对象生成的视图集的路由列表添加到django的路由中可以有两种方式:

urlpatterns = [
    ...
]

urlpatterns += router.urls

from django.urls import include,re_path
urlpatterns = [
    ...
    path("", include(router.urls))
]

 

## 视图集中附加action的声明

在视图集中,如果想要让Router自动帮助我们为自定义视图方法生成对应路由信息,需要使用`rest_framework.decorators.action`装饰器。action装饰器可以让开发者在视图中绑定要路由集生成的url地址

action装饰器可以接收两个参数:

- **methods**: 声明该action对应的请求方式,列表参数

- **detail**: 声明该action的路径是否为单一资源,也就是使用生成附带pk值的url路径
- True 表示路径格式是`<prefix>/<pk>/<url_path>/`
- False 表示路径格式是`<prefix>/<url_path>/`

- url_path:声明该action的路由尾缀。默认就是视图方法名

举例:

 

from rest_framework.viewsets import ModelViewSet
from rest_framework.decorators import action


class StuModelViewSet(ModelViewSet):
    queryset = Student.objects.all()
    serializer_class = StudentModelSerializer

    # @action(methods=["GET", "POST"], detail=False, url_path="abc")
    @action(methods=["GET", "POST"], detail=False)
    def login(self, request):
        print(self.action)  # 获取当前视图方法名
        return Response("用户登录")

    @action(methods=["GET"], detail=True)
    def logout(self,request, pk):  # 当action装饰的参数detail值为True时,表示当前视图必须接收一个pk参数
        return Response("注销登录")

 

由路由器自动为此视图集自定义action方法形成的路由会是如下内容:

url: ^students9/login/$                                   basename: students9-login
url: ^students9/(?P<pk>[^/.]+)/logout/$       basename: students9-logout

 

 

路由router形成URL的方式

1) SimpleRouter(prefix="路由前缀",viewset=视图集类,basename="路由别名")

 

2)DefaultRouter

DefaultRouter与SimpleRouter的区别是,DefaultRouter会多附带一个默认的API根视图,返回一个包含所有列表视图的超链接响应数据。

posted @ 2025-06-24 15:05  minger_lcm  阅读(16)  评论(0)    收藏  举报