路由组件(4星)

路由Routers

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

REST framework提供了两个router

  • SimpleRouter(推荐)
  • DefaultRouter

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

使用方法

创建router对象,并注册视图集,例如

from rest_framework.routers import DefaultRouter, SimpleRouter
router = DefaultRouter()
router.register('book', views.BookAPIView, basename='book')

register(prefix, viewset, basename)

  • prefix 该视图集的路由前缀
  • viewset 视图集(不用加as_view())
  • basename 路由别名的前缀

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

^books/$    name: book-list
^books/{pk}/$ name: book-detail

添加路由数据

可以有两种方式(推荐第一种)

urlpatterns = [
...
url(r'^', include(router.urls))
]

urlpatterns = [
...
]
urlpatterns += router.urls

代码演示

使用路由类给视图集生成了路由地址

### 视图类必须继承了ViewSetMixin的子类才能使用自动生成路由
from rest_framework.viewsets import ModelViewSet class BookAPIView(ModelViewSet):
queryset = Book.objects.all()
serializer_class = BookModelSerializer def login(self, request):
return Response('登陆')

路由代码:

"""使用drf提供路由类router给视图集生成路由列表"""
# 实例化路由类
# drf提供一共提供了两个路由类给我们使用,他们用法一致,功能几乎一样
from rest_framework.routers import DefaultRouter, SimpleRouter # 随便用一个
router = DefaultRouter()
# 注册视图集
# router.register("路由前缀",视图集类) 别名basename可以省略
router.register('book', views.BookAPIView, basename='book')
# 把生成的路由列表追加到urlpatterns
urlpatterns = [
path('admin/', admin.site.urls),
path('', include(router.urls))
]

urlpatterns += router.urls

上面的代码就成功生成了路由地址(增删改查一个/查多个), 但是不会添加我们在视图集自定义方法的路由。

所以我们如果也要给自定义方法生成路由,则需要进行action动作的声明。

重写方法

重写list方法

在视图类中

class BookAPIView(ModelViewSet):
queryset = Book.objects.all()
serializer_class = BookModelSerializer def list(self, request, *args, **kwargs):
# 调用父类的方法(不然直接调用self.list()就递归了)
response = super().list(request, *args, **kwargs)
# 这里的response.data是之前返回给前端的数据
res = {'result': response.data, 'msg': '查询成功', 'code': 100}
return Response(res)

在路由中

from rest_framework.routers import SimpleRouter

router = SimpleRouter()
router.register('book', views.BookAPIView, basename='book') urlpatterns = [
path('admin/', admin.site.urls),
path('', include(router.urls))

扩展自己的方法(action装饰器)

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

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

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

  • methods: 声明该action对应的请求方式,列表传递

  • detail: 声明该action的路径是否与单一资源对应

    • True 表示路径格式是xxx//action方法名/
    • False 表示路径格式是xxx/action方法名/
    from rest_framework.viewsets import ModelViewSet
    from rest_framework.decorators import action
    class TestAPIView(ModelViewSet):
    queryset = Book.objects.all()
    serializer_class = BookModelSerializer
    # methods 设置当前方法允许哪些http请求访问当前视图方法
    # detail 设置当前视图方法是否是操作一个数据
    # detail为True,表示路径名格式应该为 ^book/(?P<pk>[^/.]+)/login/$
    # 在**kwargs里可以取到pk的值
    @action(methods=['GET', ], detail=False)
    def login(self, request, *args, **kwargs):
    return Response('登陆')

    在urls.py中

    from rest_framework.routers import SimpleRouter
    router = SimpleRouter()
    router.register('test', views.TestAPIView, 'test')
    urlpatterns = [
    path('', include(router.urls)),
    ]
    • url_path: 把指定数据添加到路径后缀,默认是把函数名添加到路径后缀

      url_path = 'xxx' 那么url为 test/(?P [ ^/. ]+)/xxx/$

    • url_name='xxx' 起别名

    补充(了解),必须继承ViewSetMixin的视图类才有

    视图类有action属性,是当此请求要执行的函数名

总结

1 自动生成路由的视图类,
-需要继承ViewSetMixin+9个视图字类
-需要继承ViewSetMixin+视图类(GenericAPIView。。。)+5个视图扩展类
2 可以使用action的视图类,ViewSetMixin+视图类(APIView...)

drf路由组件(4星)的更多相关文章

  1. DRF路由组件和渲染器组件

    参考博客:https://www.cnblogs.com/wupeiqi/articles/7805382.html

  2. DRF 视图组件,路由组件

    视图组件  -- 第一次封装   -- GenericAPIView(APIView):    queryset = None    serializer_class = None    def ge ...

  3. 【DRF框架】路由组件

    视图组件涉及的路由补充: from rest_framework.viewsets import ViewSetMixin 对路由进行了重新的分发,重写了as_view() 方法,重新封装了请求方法 ...

  4. drf二次封装response-APIViews视图家族-视图工具集-工具视图-路由组件

    视图类传递参数给序列化类 (1).在视图类中实例化 序列化对象时,可以设置context内容. (2).在序列化类中的局部钩子.全局钩子.create.update方法中,都可以用self.conte ...

  5. DRF之Jwt 实现自定义和DRF小组件及django-filter插件的使用

    一.DRF之Jwt 实现自定义 二.DRF(过滤,排序,分页)组件 三.Django-filter插件的使用和自定义 """ 1.drf-jwt手动签发与校验 :只是做t ...

  6. drf认证组件、权限组件、jwt认证、签发、jwt框架使用

    目录 一.注册接口 urls.py views.py serializers.py 二.登录接口 三.用户中心接口(权限校验) urls.py views.py serializers.py 四.图书 ...

  7. 视图家族 & 路由组件

    目录 视图家族 & 路由组件 视图集与路由组件 基于 GenericAPIView 的十大接口 基于 generics 包下工具视图类的六大基础接口 视图集 路由组件:必须配合视图集使用 自定 ...

  8. DRF视图组件

    DRF视图组件: CVB模式继承----五层 from django.views import View # Django的View from rest_framework.views import ...

  9. DRF版本组件

    1.DRF版本组件配置类局部使用 局部配置: 方式一:直接配置versioning_class=QueryParameterVersioning 方式二:直接配置versioning_class=UR ...

随机推荐

  1. DTD与Schema约束

    1.DTD:(Document Type Definition)是一套为了进行程序间的数据交换而建立的关于标记符的语法 规则.它是标准通用标记语言.2.XML Schema 是基于XML的DTD替代者 ...

  2. 线性表是否为空,定位元素下标(基于c语言)

    /*前面已经说过结构体中的n是代表已经放入线性表中元素的个数,所以判断线性表是否为空就是判断n的值是否为空*/ //书中代码如下 int isNullList_seq(PSeqList palist) ...

  3. 4月12日 python学习总结 继承和派生

    一.继承 什么是继承:   继承是一种新建类的方式,在python中支持一个子类继承多个父类   新建类称为子类或派生类   父类可以称之为基类或者超类   子类会遗传父类的属性 2.  为什么继承 ...

  4. kdump原理,是如何找到入口的

    请解释下kdump原理,捕获内核是如何获取到生产内核的首地址的.

  5. WinCE知识介绍

    学习WinCE基本开发的步骤: 1.了解WinCE发展史: 2.WinCE开发环境搭建:[软件工具+插件] 3.简单案例: 参考:http://blog.csdn.net/educast/articl ...

  6. 去掉一个Vector集合中重复的元素 ?

    Vector newVector = new Vector(); For (int i=0;i<vector.size();i++) { Object obj = vector.get(i); ...

  7. Ls 命令执行什么功能?可以带哪些参数,有什么区别?

    ls 执行的功能:列出指定目录中的目录,以及文件 哪些参数以及区别:a 所有文件 l 详细信息,包括大小字节数,可读可写可执行的权限等

  8. 为什么 String 在 Java 中是不可变的?

    我最喜欢的 Java 面试问题,很棘手,但同时也非常有用.一些面试者也常问这个问题,为什么 String 在 Java 中是 final 的.字符串在 Java 中是不可变的,因为 String 对象 ...

  9. SpringMVC怎么样设定重定向和转发的?

    (1)转发:在返回值前面加"forward:",譬如"forward:user.do?name=method4" (2)重定向:在返回值前面加"red ...

  10. Eureka和ZooKeeper都可以提供服务注册与发现的功能,请说说两个的区别?

    1.ZooKeeper保证的是CP,Eureka保证的是AP ZooKeeper在选举期间注册服务瘫痪,虽然服务最终会恢复,但是选举期间不可用的 Eureka各个节点是平等关系,只要有一台Eureka ...