REST framework 路由组件

from django.conf.urls import include
from rest_framework.routers import SimpleRouter
router = SimpleRouter()  # SimpleRouter类内部做了{请求:函数}的映射关系
# 所有路由与ViewSet视图类的都可以注册,会产生 '^v6/books/$' 和 '^v6/books/(?P<pk>[^/.]+)/$'
router.register('v6/books', views.BookModelViewSet)
​
urlpatterns = [
    # 第一种添加子列表方式
    url(r'^', include(router.urls)),
]
# 第二种添加子列表方式
# urlpatterns.extend(router.urls)

SimpleRouter 源码:

class SimpleRouter(BaseRouter):
    # 没有 pk 时做的映射关系
     routes = [
        # List route.
        Route(
            url=r'^{prefix}{trailing_slash}$',  # 没有pk
            # 映射关系
            mapping={
                'get': 'list',
                'post': 'create'
            },
            name='{basename}-list',
            detail=False,
            initkwargs={'suffix': 'List'}
        ),
    # 有 pk 时做的映射关系
     Route(
            url=r'^{prefix}/{lookup}{trailing_slash}$',  # 有pk
            # 映射关系
            mapping={
                'get': 'retrieve',
                'put': 'update',
                'patch': 'partial_update',
                'delete': 'destroy'
            },
            name='{basename}-detail',
            detail=True,
            initkwargs={'suffix': 'Instance'}
        ),
# 1 导入路由类
from rest_framework.routers import SimpleRouter, DefaultRouter
# DefaultRouter生成的路由更多一点,多了一个根的路由(没有用)
# 2 实例化得到对象
router = SimpleRouter()


router.register('books', views.BookView)
router.register('publish', views.PublishView)

# print(router.urls) # 自动生成的路由
urlpatterns = [
    # 3 注册路由 把自动生成的路径加入到urlpatterns
    path('api/v1/', include(router.urls)),
]
# 4 把自动生成的路径加入到urlpatterns
urlpatterns+=router.urls

总结:ViewSetMixin+9个视图子类才能用自动生成路由

action装饰器

在视图集中,如果想要让Router自动帮助我们为自定义的动作生成路由信息,需要使用rest_framework.decorators.action装饰器。

以action装饰器装饰的方法名会作为action动作名,与list、retrieve等同。

methods: 声明该action对应的请求方式,列表传递
detail: 声明该action的路径是否与单一资源对应,及是否是xxx/<pk>/action方法名/
True 表示路径格式是xxx/<pk>/action方法名/
False 表示路径格式是xxx/action方法名/

1 作用:给自动生成路由的视图类再定制一些路由

class test(viewsets.ModelViewSet):
    2 用法一:
    # api/v1/publish/sen_email/
    @action(methods=['GET'], detail=False)
    def sen_email(self, request, *args, **kwargs):
        print(args)
        print(kwargs)
        return APIResponse(msg='发送成功')
    
    3 方法二:
    # api/v1/publish/10/sen_email/
    @action(methods=['GET'], detail=True)
    def sen_email(self, request, *args, **kwargs):
        # pk=10
        print(args)
        print(kwargs)
        return APIResponse(msg='发送成功')

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值