Django-DRF组件学习-路由学习
1.路由router
对于视图集ViewSet,我们除了可以自己手动指明请求方式与动作action之间的对应关系外,还可以使用Routers来帮助我们快速实现路由信息。
REST framework提供了两个router
SimpleRouter
DefaultRouter
1.1 使用方法
1) 创建router对象,并注册视图集,例如
- from rest_framework import routers
-
- router = routers.DefaultRouter()
- router.register(r'router_stu', StudentModelViewSet, base_name='student')
register(prefix, viewset, base_name)
prefix 该视图集的路由前缀
viewset 视图集
base_name 路由别名的前缀
如上述代码会形成的路由如下:
- ^books/$ name: book-list
- ^books/{pk}/$ name: book-detail
2)添加路由数据
可以有两种方式:
- urlpatterns = [
- ...
- ]
- urlpatterns += router.urls
- 或
- urlpatterns = [
- ...
- url(r'^', include(router.urls))
- ]
使用路由类给视图集生成了路由地址
- from rest_framework.viewsets import ModelViewSet,ReadOnlyModelViewSet
- class StudentModelViewSet(ModelViewSet):
- queryset = Student.objects.all()
- serializer_class = StudentModelSerializer
-
- def login(self,request):
- """学生登录功能"""
- print(self.action)
- return Response({"message":"登录成功"})
路由代码:
- from django.urls import path, re_path
- from . import views
- urlpatterns = [
- ...
- ]
-
- """使用drf提供路由类router给视图集生成路由列表"""
- # 实例化路由类
- # drf提供一共提供了两个路由类给我们使用,他们用法一致,功能几乎一样
- from rest_framework.routers import DefaultRouter
- router = DefaultRouter()
-
- # 注册视图集
- # router.register("路由前缀",视图集类)
- router.register("router_stu",views.StudentModelViewSet)
-
- # 把生成的路由列表追加到urlpatterns
- print( router.urls )
- urlpatterns += router.urls
上面的代码就成功生成了路由地址[增/删/改/查一条/查多条的功能],但是不会自动我们在视图集自定义方法的路由。
所以我们如果也要给自定义方法生成路由,则需要进行action动作的声明。
1.2 视图集中附加action的声明
在视图集中,如果想要让Router自动帮助我们为自定义的动作生成路由信息,需要使用rest_framework.decorators.action
装饰器。
以action装饰器装饰的方法名会作为action动作名,与list、retrieve等同。
action装饰器可以接收两个参数:
methods: 声明该action对应的请求方式,列表传递
detail
: 声明该action的路径是否与单一资源对应,及是否是
- xxx/<pk>/action方法名/
True 表示路径格式是
xxx/<pk>/action方法名/
False 表示路径格式是
xxx/action方法名/
举例:
- from rest_framework.viewsets import ModelViewSet
- from rest_framework.decorators import action
-
- class StudentModelViewSet(ModelViewSet):
- queryset = Student.objects.all()
- serializer_class = StudentModelSerializer
-
- # methods 设置当前方法允许哪些http请求访问当前视图方法
- # detail 设置当前视图方法是否是操作一个数据
- # detail为True,表示路径名格式应该为 router_stu/{pk}/login/
- @action(methods=['get'], detail=True)
- def login(self, request,pk):
- """登录"""
- ...
-
- # detail为False 表示路径名格式应该为 router_stu/get_new_5/
- @action(methods=['put'], detail=False)
- def get_new_5(self, request):
- """获取最新添加的5个学生信息"""
- ...
由路由器自动为此视图集自定义action方法形成的路由会是如下内容:
- ^router_stu/get_new_5/$ name: router_stu-get_new_5
- ^router_stu/{pk}/login/$ name: router_stu-login
1.3 路由router形成URL的方式
1) SimpleRouter
2)DefaultRouter
DefaultRouter与SimpleRouter的区别是,DefaultRouter会多附带一个默认的API根视图,返回一个包含所有列表视图的超链接响应数据。
ok
Django-DRF组件学习-路由学习的更多相关文章
- django drf 开发 ~ models基础学习
零 介绍 对于ORM框架,可以简单的认为自定义类U表示数据库的表:根据类创建的对象表示数据库表一 数据表设计 1 类型统计 CharField->(string)->(1 ma ...
- Django学习---路由url,视图,模板,orm操作
Django请求周期 url -> 路由系统 ->函数或者类 -> 返回字符串 或者 模板语言 Form表单提交: 点击提交 -> 进入url系统 -> 执行函数 ...
- Django学习——路由层之路由匹配、无名分组、有名分组、反向解析
路由层之路由匹配 """路由你可以看成就是出去ip和port之后的地址""" url()方法 1.第一个参数其实是一个正则表达式 2.一旦第 ...
- GitHub标星8k,字节跳动高工熬夜半月整理的“组件化实战学习手册”,全是精髓!
前言 什么是组件化? 最初的目的是代码重用,功能相对单一或者独立.在整个系统的代码层次上位于最底层,被其他代码所依赖,所以说组件化是纵向分层. 为什么要使用组件化? 当我们的项目越做越大的时候,有时间 ...
- CCNA的RIP路由学习
rip(routing infomation protocol,路由信息协议) ,是一个纯粹的距离矢量路由选择协议,RIP每隔30s就将自己完整的路由选择表从所有激活的接口上送出.RIP只将跳计数作为 ...
- stark组件之路由分发【模仿Django的admin】
一.先看下django的admin是如何进行路由分发的 1.先看下django的admin的url路径有哪些 其实很简单,假如有一个书籍表,那么每张表对应四个url,增.删.改.查 查看的url ht ...
- Linux 路由 学习笔记 之一 相关的数据结构
http://blog.csdn.net/lickylin/article/details/38326719 从现在开始学习路由相关的代码,在分析代码之前, 我们还是先分析数据结构,把数据结构之间的关 ...
- python 全栈开发,Day98(路飞学城背景,django ContentType组件,表结构讲解)
昨日内容回顾 1. 为什么要做前后端分离? - 前后端交给不同的人来编写,职责划分明确. - API (IOS,安卓,PC,微信小程序...) - vue.js等框架编写前端时,会比之前写jQuery ...
- 自定义 Django admin 组件
摘要:学习 Django admin 组件,仿照源码的逻辑,自定义了一个简易的 stark 组件,实现类似 admin 的功能. 可自动生成 url 路由,对于model 有与之相应的配置类对象,可进 ...
随机推荐
- 再谈变分自编码器VAE:从贝叶斯观点出发
链接:https://kexue.fm/archives/5343
- 用Maven搭建简单的SpringMVC框架
本文会详细阐述如何用Maven搭建一个简单的SpringMVC框架 这里就不介绍SpringMVC框架了,咱们直接来搭建 第一步 创建一个Maven的web项目 这里有一个简单的方法 new一个Ma ...
- mysql忘记密码如何重置密码,以及修改root密码的三种方法
1.先将MySQL停止. 命令:systemctl stop mysqld #停掉MySQL 命令:systemctl status mysqld #查看状态 2.然后跳 ...
- MyEclipse使用教程:unattended安装
[MyEclipse CI 2019.4.0安装包下载] 以下内容适用于2013及以上版本. 运行无提示安装程序 1. 创建一个unattended response文件. 2. 要激活unatten ...
- 从springmvc 过度到 springboot
1.web.xml 形式的MVC项目 web.xml ,web.xml的启动类在 web 容器里,即Tomcat中. Tomcat的main方法会加载 web.xml.为什么Tomcat会加载 web ...
- python类库26[sqlite]
一 sqlite 与 python 的类型对应 二 实例 import sqlite3 def sqlite_basic(): # Connect to db conn = sqlit ...
- python 脚本制作
U盘拷贝 当U盘插入主机时 被系统识别挂载后 通过python代码自动的去读取U盘中的资料并且进行拷贝 寄存在U盘上的 把硬盘上的资料进行读取并移动到U盘里 有点像 繁殖性 传输性 破坏性 破坏系统或 ...
- R语言-六大数据结构
R语言有六种基本的数据结构(或者说数据类型吧).根据数据的维度和同质/异质可分为5种数据类型,最后再介绍一种特殊的类型“因子”. 同质 异质 1维 原子向量 列表 2维 矩阵 数据框 n维 数组 ...
- 【leetcode】Find Largest Value in Each Tree Row
You need to find the largest value in each row of a binary tree. Example: Input: 1 / \ 3 2 / \ \ 5 3 ...
- 对MySQL binlog日志解析,统计每张表的DML次数
想要获取每天数据库每张表的DML的次数,统计热度表,可以使用该脚本 # coding:utf-8 # 解析binlog,统计热度表,表的DML个数 import sys import os # mys ...