一 自动生成路由

基本使用

# 视图类,继承了ViewSetMixein,路由
# path('books/', views.BookViewSet.as_view(actions={'get': 'list', 'post': 'create'})),
# path('book/<int:pk>/',
# views.BookViewSet.as_view(actions={'get': 'retrieve', 'put': 'update', 'delete': 'destroy'})), # 继承自视图类,ModelViewSet的路由写法(自动生成路由)
# 第一步:导入routers模块
from rest_framework import routers
# 第二步:有两个类,实例化得到对象
# routers.DefaultRouter 会产生六条路由,有两条跟SimpleRouter一样,其余四条用处不大
# routers.SimpleRouter
router = routers.SimpleRouter()
# 第三步:注册
# router.register('前缀', '继承自ModelViewSet视图类', '别名')
router.register('books', views.BookViewSet)
# 第四步:自动生成路由,并加入路由中
print(router.urls)
# [<URLPattern '^books/$' [name='book-list']>,
<URLPattern '^books/(?P<pk>[^/.]+)/$' [name='book-detail']>]
urlpatterns = [
path('admin/', admin.site.urls),
# routers产生的路由跟自己写的一样
# path('books/', views.BookViewSet.as_view(actions={'get': 'list', 'post': 'create'})),
# path('book/<int:pk>/',
# views.BookViewSet.as_view(actions={'get': 'retrieve', 'put': 'update', 'delete': 'destroy'})),
]
# 两个列表相加
urlpatterns += router.urls # views.py
from rest_framework.viewsets import ModelViewSet
from app01 import models
from app01.ser import BookSerializer class BookViewSet(ModelViewSet):
queryset = models.Book.objects.all()
serializer_class = BookSerializer

使用SimpleRouter()实例化的路由格式

# 项目中打印
# print(router.urls)
'''
[
<RegexURLPattern book-list ^books/$>,
<RegexURLPattern book-detail ^books/(?P<pk>[^/.]+)/$>
]
''' # 浏览器中打印
'''
# 解析: [^/.]+
[^/.]+ 中^表示取反 意思就是匹配任意其它内容, /就不匹配.
+号表示且匹配1个或者多个 ^app01/ ^books/$ [name='book-list']
^app01/ ^books/(?P<pk>[^/.]+)/$ [name='book-detail']
'''

使用DefaultRouter()类实例化的路由格式

# 项目中打印
'''
[
<RegexURLPattern book-list ^books/$>,
<RegexURLPattern book-list ^books\.(?P<format>[a-z0-9]+)/?$>,
<RegexURLPattern book-detail ^books/(?P<pk>[^/.]+)/$>,
<RegexURLPattern book-detail ^books/(?P<pk>[^/.]+)\.(?P<format>[a-z0-9]+)/?$>, <RegexURLPattern api-root ^$>,
<RegexURLPattern api-root ^\.(?P<format>[a-z0-9]+)/?$>
]
''' # 浏览器中打印
'''
^app01/ ^books/$ [name='book-list']
^app01/ ^books\.(?P<format>[a-z0-9]+)/?$ [name='book-list']
^app01/ ^books/(?P<pk>[^/.]+)/$ [name='book-detail']
^app01/ ^books/(?P<pk>[^/.]+)\.(?P<format>[a-z0-9]+)/?$ [name='book-detail']
^app01/ ^$ [name='api-root']
^app01/ ^\.(?P<format>[a-z0-9]+)/?$ [name='api-root']
'''

总结

1. 使用范围: 只有继承了 ViewSetMixin 类的视图, 才可以使用路由组件快速生成路由
2. 快速生成路由的2种路由类: SimpleRouter, DefaultRouter
3. 路由中使用:
from django.conf.urls import include
from rest_framework.routes import SimpleRouter
router = SimpleRouter()
router.register('路由前缀', 继承了ViewSetMixin类的视图, 用于反向解析的别名)
urlpatterns = [
url('', include(router.urls)), # 添加路由的第二种方式
]
urlpatterns += router # 添加路由的第一种方式

二. 视图中action装饰器

# action是用来给继承自ModelViewSet的视图类中自定义的函数也添加路由
from rest_framework.decorators import action
class BookViewSet(ModelViewSet):
queryset = models.Book.objects.all()
serializer_class = BookSerializer # methods第一个参数,传一个列表,列表中放请求方式
# detail=False 生成的路由是^books/get_1/$ [name='book-get-1']
# detail=True 自定义函数需要加pk,生成的路由是^books/(?P<pk>[^/.]+)/get_1/$ [name='book-get-1']
# http://127.0.0.1:8000/books/1/get_1/
@action(methods=['get', 'post'], detail=True)
def get_1(self, request, pk):
query_book = self.get_queryset()[0:1] # 顾头不顾尾,取一条
book_ser = self.get_serializer(query_book, many=True) # 传的列表,所以要加many=True
return Response(book_ser.data) # 装饰器,放在被装饰器函数上方,method:请求方式,detail:是否带pk

源码

'''
提示: action是一个装饰器 导入方式: from rest_framework.decorators import action 作用: 给继承自ModelViewSet的视图类中定义的函数也添加路由 def action(methods=None, detail=None, url_path=None, url_name=None, **kwargs):
"""
methods: 第一个参数,传一个列表,列表中放请求方式
提示: 由下面的源码得知如果没有指定参数, 默认是get方法. 且方法可以大写, 可以小写. 大写的话就会将大写的字符串转换成小写
methods = ['get'] if (methods is None) else methods
methods = [method.lower() for method in methods]
detail: 指定布尔值. 控制路由匹配的形式. True可以匹配单条数据, False可以匹配多条数据
True时匹配规则: ^app02/ ^books/(?P<pk>[^/.]+)/get_two/$ [name='book-get-two']
False时匹配规则: ^app02/ ^books/get_two/$ [name='book-get-two']
"""
'''

总结

# 为什么使用action装饰器?
因为快速生成路由组件无法手动添加路由 和 无法修改视图类中方法名, 通过action就可以快速实现. # 使用流程
1. 导入: from rest_framework.decorators import action
2. 在视图中为视图中的方法添加装饰器
class BookView(ViewSet):
@action(method=["post", ], detail=True)
def login():
...
参数介绍:
method: 不指定, 默认就是get方法. 如果指定大写, 默认就会转成小写.
detail: 不指定, 会抛出异常. 指定True, False表示的路由不一样. 看3
3. 路由中就会新增一个路由
detail=True时: url(r'^books/(?P<pk>)/login/$')
detail=False时: url(r'^books/login/$')

三. 补充: 路由生成的二种方法

urlpatterns = [
# 1. 生成的路由第一种添加方法
url(r'', include(router.urls))
]
# 2. 生成的路由第二种添加方法
urlpatterns += router.urls

四. 补充: 关于路由组件的使用

路由组自动生成的原理: 自动生成路由, 自动配置actions参数.
也就是说只要是继承了ViewSetMixin的视图类, 都可以配置路由组件.

drf(路由)的更多相关文章

  1. drf路由分发、解析/渲染模块配置、使用admin、自动序列化配置

    目录 drf路由分发配置 解析模块配置 渲染模块配置 浏览器渲染打开 浏览器渲染关闭 结论 drf使用后台admin drf序列化模块 serializers.py: views.py:单查群查 测试 ...

  2. 【DRF路由】

    在urls.py文件中按照如下步骤写,即可正确使用DRF的内置路由. from .views import BookModel # 1. 导入我们的视图 from rest_framework.rou ...

  3. drf路由与认证

    目录 一.路由 1 没有继承视图集的视图类 2 继承了视图集的视图类 3 继承自ModelViewSet的路由写法(自动生成) 二.认证 1 drf认证的源码分析 2 自定义认证类的使用 一.路由 三 ...

  4. drf 路由生成

    前言 在drf中,我们写接口可以通过继承modelViewSet从而达到非常快速的功能实现,这十分的方便,但是modelViewSet由于需要根据不同的参数来对应不同的处理,所以我们写的url最少都需 ...

  5. drf路由组件(4星)

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

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

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

  7. DRF的路由生成类的使用

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

  8. Django REST Framework(DRF)_第二篇

    视图和路由 视图封装 第一次封装 ​ 上一篇最后我们对书籍表做了增删改查,那么如果现在我们有几十上百张表需要这样做呢?我们知道类的特性有封装,因此我们可以尝试进行封装下. from rest_fram ...

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

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

  10. rest-framework框架——解析器、ur控制、分页、响应器、渲染器、版本

    一.解析器(parser) 解析器在reqest.data取值的时候才执行. 对请求的数据进行解析:是针对请求体进行解析的.表示服务器可以解析的数据格式的种类. from rest_framework ...

随机推荐

  1. NC19857 最后的晚餐(dinner)

    题目链接 题目 题目描述 ​ **YZ(已被和谐)的食堂实在是太挤辣!所以Apojacsleam现在想邀请他的一些好友去校外吃一顿饭,并在某酒店包下了一桌饭. ​ 当Apojacsleam和他的同学们 ...

  2. 从零开始手写 mybatis (三)jdbc pool 从零实现数据库连接池

    前景回顾 第一节 从零开始手写 mybatis(一)MVP 版本 中我们实现了一个最基本的可以运行的 mybatis. 第二节 从零开始手写 mybatis(二)mybatis interceptor ...

  3. 【Unity3D】边缘检测特效

    1 边缘检测原理 ​ 边缘检测的原理是:检测每个像素周围的像素亮度差,如果亮度差异较大,就将该像素识别为边缘,并进行边缘着色. ​ 本文完整资源见→Unity3D边缘检测特效. ​ 使用过卷积神经网络 ...

  4. 使用TensorFlow实现MNIST数据集分类

    1 MNIST数据集 MNIST数据集由70000张28x28像素的黑白图片组成,每一张图片都写有0~9中的一个数字,每个像素点的灰度值在0 ~ 255(0是黑色,255是白色)之间. MINST数据 ...

  5. Js中Symbol对象

    Js中Symbol对象 ES6引入了一种新的基本数据类型Symbol,表示独一无二的值,最大的用法是用来定义对象的唯一属性名,Symbol()函数会返回symbol类型的值,该类型具有静态属性和静态方 ...

  6. Spring源码之springMVC

    目录 web.xml 程序入口 servlet 初始化 运行阶段 销毁阶段 DispatcherServlet 初始化 DispatcherServlet 的逻辑处理 web.xml 它的作用是配置初 ...

  7. 【Android 逆向】【攻防世界】人民的名义-抓捕赵德汉1-200

    1. 这一题下载下来是个jar文件,感觉很android关系不大,但还是放在了mobile这个分类下了 2. 直接java jar运行,提示需要输入密码 # java -jar 169e139f152 ...

  8. Qt+QtWebApp开发笔记(二):http服务器日志系统介绍、添加日志系统至Demo测试

    前言   上一篇使用QtWebApp的基于Qt的轻量级http服务器实现了一个静态网页返回的Demo,网页服务器很重要的就是日志,因为在服务器类上并没有直接返回,所以,本篇先把日志加上.   Demo ...

  9. 记一个 Duplicate class kotlin-stblib vs kotlin-stdlib-jdk7/8 编译问题引发的案例

    某天将项目 kotlin 版本升级到了 1.8.0 ,然后编译报错了, Duplicate class kotlin-stblib vs kotlin-stdlib-jdk7/8 然后开始寻求解决方案 ...

  10. ubantu18.04使用APT安装go环境指令报错解决方案

    在ubantu下使用sudo apt install golang-go指令安装go环境,安装过程没有报错,在使用时无法识别指令,报错如下: root@sh001:~# go env -w GOPRO ...