Loading

27.路由器Routers

像一些reils这样的web框架提供自动生成urls的功能,但是Django没有
rest framework为django添加了这一功能,以一种简单、快速、一致的方式
routers必须配合viewset使用
#导包
from rest_framework import routers


'''
DRF的routers模块主要包含以下几个类
BaseRouter:路由的基类
SimpleRouter:继承了BaseRouter 常用类之一
DefaultRouter:继承了BaseRouter 常用类之一
DynamicDetailRoute
DynamicListRoute
RenameRoutermethods
APIRootView
我们主要使用的就是SimpleRouter、DefaultRouter
'''
基本用法示例-继承SimpleRouter
# 实例化一个SimpleRouter对象router
router = routers.SimpleRouter()
# 使用register方法注册路由模式
router.register(r'update/', TestUpdateView)
router.register(r'read/', TestReadView)


'''
对于register()方法,有两个必填参数
   1.prefix:用户视图集的url路径前缀
   2.vewset:对应的视图集类
还有一个可选,但是又特别重要的参数
   basename:URL的name属性的基础部分
   如果没有显示的指定这个参数,那么将以视图集的queryset属性的值自动生成
   如果视图集没有queryset属性,那么你必须在register方法里设置 
'''
 
# 将router的urls属性赋值给django的基本路由变量urlpatterns
urlpatterns = router.urls
 
自定义生成路由
class TestUpdateView(viewsets.ModelViewSet):


    @action(
    methods=['get'],detail=False,
    url_path='get-info', #在action自定义设置path
    url_name='get_info' #action中自定义指定name
    # 这样路由会使用自定义的规则,而不会使用自动生成的规则
    )
    def getInfo(self,request):
        ...
 
将ViewSets绑定到URL路由上
 
'''
SnippetViewSet继承ModelViewSet,默认有ViewSet提供的 list、update等方法
自己定义get请求方法getInfo
'''

urlpatterns = [
    path('admin/', admin.site.urls),
    path('sinpple/',views.SnippetViewSet.as_view(
         'get': 'list',  #get请求 sinpple,使用ModelViewSet提供的list方法
         'put': 'update'  #put请求 sinpple,使用ModelViewSet提供的update方法
    ))
    
    
    # 由于一个视图集中我们有多个get请求都要使用,上面使用get访问list方法,所有再定义get我们需求生成新的路由,
    # 不然全部是一个url路径,两个get请求不知道访问哪个方法
    path('sinppleInfo/',views.SnippetViewSet.as_view({'get':'getInfo'})
]

'''
此方法是自己把viewset方法绑定到url上,并没有使用Router.register去注册,所以不会自动去生成路由
需要自动生成路由的话,可以使用对应方法去注册
'''
路由器其他语法
路由合并
DRF路由器对象的urls属性,本质上是一个Django标准的URL模式对象,同样可以使用标准的Django路由语法和功能。
可以将 router.urls 追加到现有的urlpatterns里,也就是列表+列表的合并操作
 
urlpatterns = [
    path('admin/', admin.site.urls),
]
urlpatterns += router.urls
 
路由分发
urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include(router.urls)), # 转发到DRF的router
]
 
提供一个app的命名空间参数
urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/', include((router.urls, 'app_name'))),
    ]
 
app和实例的命名空间
 
urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/', include((router.urls, 'app_name'),namespace='instance_name')),
    ]
 
SimpleRouter和DefaultRouter的区别
SimpleRouter类包含标准的list , create , retrieve , update , partial_update 和 destroy 
这些操作所对应的url以及 @action 装饰器带来的操作
默认情况下, SimpleRouter 将为每一条url添加一个斜杠后缀
如果不想这么做,可以在初始化的时候提供 trailing_slash 参数,并设置为 False 
router = SimpleRouter(trailing_slash=False)
 
 
DefaultRouter类和 SimpleRouter 基本类似
不同之处在于它还会自动生成默认的API根视图的url路径。另外,它还可以为 .json 类型的请求生成对应的url
 
 
 
 
 
 
 
 
 

posted @ 2022-09-19 16:09  木子七  阅读(125)  评论(0编辑  收藏  举报