路由组件(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. VuePress 博客之 SEO 优化(二)重定向

    前言 在 <一篇带你用 VuePress + Github Pages 搭建博客>中,我们使用 VuePress 搭建了一个博客,最终的效果查看:TypeScript 中文文档. 本篇讲讲 ...

  2. 闲聊系列之 5-why root cause分析法

    本篇参考: https://max.book118.com/html/2017/1126/141669829.shtm https://baike.baidu.com/item/5why%E5%88% ...

  3. Linux上后台保持Terminal交互运行的三种方式:nohub、screen和tmux

    镜像下载.域名解析.时间同步请点击 阿里云开源镜像站 后台运行 Linux上,如果一个进程需要保持后台运行,尤其是在Linux服务器上,后台运行程序.避免因为SSH连接断开而导致进程停止运行时,该怎么 ...

  4. Linux系统配置(系统优化)

    镜像下载.域名解析.时间同步请点击  阿里云开源镜像站 前言 系统安装完成后,需要基于系统做出一些调整来让系统使用起来更加顺手,可以根据个人喜好对linux进行调整,还有一些是linux的必要设置 一 ...

  5. web自动化之svg标签定位

    今天在定位元素的时候,发现页面有一个svg标签需要进行定位. 于是便使用常规的xpath定位方法试了一下,很明显结果是不行的,哈哈哈... 错误定位方法://div[@class="oper ...

  6. 手把手带你使用ZigBee——通过爱智控制EFR32,以及 Simplicity Studio 使用过程中注意事项

    前言 兄弟们,我发现一个有意思的东西,我在爱智官网翻资料的时候,发现他们终于终于把官网文档的索引优化了!有一说一,真是方便不少,终于不再是一堆文档糊在一坨了. 另外我还发现他们居然做了一个EFR32的 ...

  7. 解决Hadoop集群hdfs无法启动DataNode的问题

    问题描述: 在hadoop启动hdfs的之后,使用jps命令查看运行情况时发现hdfs的DataNode并没有打开. 笔者出现此情况前曾使用hdfs namenode -format格式化了hdfs ...

  8. 手把手带你使用Paint in 3D和Photon撸一个在线涂鸦画板

    Paint in 3D Paint in 3D用于在游戏内和编辑器里绘制所有物体.所有功能已经过深度优化,在WebGL.移动端.VR 以及更多平台用起来都非常好用! 它支持标准管线,以及 LWRP.H ...

  9. 通过R Studio用Markdown写Beamer

    技术背景 在写一些学术演示文档时,经常有可能用到Beamer--一种Latex的学术风PPT模板,比如下图所示的这种: 这种风格的演示文档有几个明显的优点:简约.严肃.可以用Latex敲公式和推导.可 ...

  10. docker容器登录,退出等操作命令

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口 ...