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 视图集 
- 
如上述代码会形成的路由如下:
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根视图,返回一个包含所有列表视图的超链接响应数据。
 
                    
                     
                    
                 
                    
                 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号