路由器

一些Web框架提供了用于自动确定应如何将应用程序的URL映射到处理传入请求的逻辑的功能。

而DRF的路由器组件也提供了一种简单,快速且一致的方式将视图逻辑映射到一组URL上。

路由器组件的使用配合include

第一步:导入模块

from rest_framework import routers

第二步:实例化一个router对象

router = routers.SimpleRouter()

第三步:将需要自动生成url的接口注册到router中

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

第四步:生成url

urlpatterns = [
re_path('', include(router.urls)),
]

路由器简单的使用

from rest_framework import routers

router = routers.SimpleRouter()
router.register('books', BookView)
router.register('users', UserView)
urlpatterns = router.urls

register 方法有两个强制性参数:

  • prefix    -   用于这组路由的URL前缀。
  • viewset  -   视图集类。

(可选)其他参数:

  • basename - 用于创建的URL名称的基础。如果未设置,则基名称将基于queryset视图集的属性自动生成(如果有)。
  • 请注意,如果视图集不包含queryset属性,则必须basename在注册视图集时进行设置。

在使用路由组件之前的url:

urlpatterns = [

    path("books/", views.BookView.as_view({
"get": "list",
"post": "create",
})),
re_path('books/(?P<pk>\d+)/', views.BookView.as_view({
'get': 'retrieve',
'put': 'update',
'delete': 'destroy'
})),
]

使用路由器之后的url:

router = routers.DefaultRouter()
router.register("books", views.BookView) urlpatterns = [
re_path('', include(router.urls)),
]

可以发现简单了很多~

版本控制

API版本控制,可以更改不同客户端之间的行为方式。REST框架提供了许多不同的版本控制方案例如:

某些客户端 使用低版本只维护不开发新功能 v1

主要的产品还要不断的更新迭代功能 v2

API 版本控制允许我们在不同的客户端之间更改行为(同一个接口的不同版本会返回不同的数据)。 DRF提供了许多不同的版本控制方案。

DRF提供版本控制的五种方案

rest_framework 框架里的 versioning.py 文件

class BaseVersioning:
pass # 将版本信息放到请求头中
class AcceptHeaderVersioning(BaseVersioning):
"""
GET /something/ HTTP/1.1
Host: example.com
Accept: application/json; version=1.0
"""
pass # 将版本信息放到URL中
class URLPathVersioning(BaseVersioning):
"""
To the client this is the same style as `NamespaceVersioning`.
The difference is in the backend - this implementation uses
Django's URL keyword arguments to determine the version. An example URL conf for two views that accept two different versions. urlpatterns = [
url(r'^(?P<version>[v1|v2]+)/users/$', users_list, name='users-list'),
url(r'^(?P<version>[v1|v2]+)/users/(?P<pk>[0-9]+)/$', users_detail, name='users-detail')
] GET /1.0/something/ HTTP/1.1
Host: example.com
Accept: application/json
"""
pass # 将版本信息放在命名空间 namespace
class NamespaceVersioning(BaseVersioning):
"""
To the client this is the same style as `URLPathVersioning`.
The difference is in the backend - this implementation uses
Django's URL namespaces to determine the version. An example URL conf that is namespaced into two separate versions # users/urls.py
urlpatterns = [
url(r'^/users/$', users_list, name='users-list'),
url(r'^/users/(?P<pk>[0-9]+)/$', users_detail, name='users-detail')
] # urls.py
urlpatterns = [
url(r'^v1/', include('users.urls', namespace='v1')),
url(r'^v2/', include('users.urls', namespace='v2'))
] GET /1.0/something/ HTTP/1.1
Host: example.com
Accept: application/json
"""
pass # 将版本信息放在主机名里 Host
class HostNameVersioning(BaseVersioning):
"""
GET /something/ HTTP/1.1
Host: v1.example.com
Accept: application/json
"""
pass # 将版本信息放在URL 查询参数里
class QueryParameterVersioning(BaseVersioning):
"""
GET /something/?version=0.1 HTTP/1.1
Host: example.com
Accept: application/json
"""
pass

版本控制的使用

以URL为例:

设计 url :

router = routers.DefaultRouter()

router.register("books", views.BookView)

urlpatterns = [
# 给url设置参数
re_path('(?P<version>[v1|v2]+)/', include(router.urls)),
]

局部使用

导入模块,使用就行了

from rest_framework.versioning import URLPathVersioning

class BookView(ModelViewSet):
# 指定版本控制类,固定写法
versioning_class = URLPathVersioning
# 获取数据源, 固定写法
queryset = models.Book.objects.all()
# 序列化类, 固定写法
serializer_class = BookSerializer

全局使用

以 URLPathVersioning 为例,还是在项目的 settings.py 中 REST_FRAMEWORK 配置项下配置:

REST_FRAMEWORK = {
# 配置默认使用的版本控制类
'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.URLPathVersioning',
# 默认的版本
'DEFAULT_VERSION': 'v1',
# 有效的版本
'ALLOWED_VERSIONS': ['v1', 'v2'],
# 版本的参数名与URL conf中一致
'VERSION_PARAM': 'version',
}

这样在视图中就可以通过访问 request.version 来获取当前请求的具体版本,然后根据不同的版本来返回不同的内容:

我们可以在视图中自定义具体的行为,下面以不同的版本返回不同的序列化类为例:

class BookViewSet(ModelViewSet):
# 获取数据源,固定写法
queryset = models.Book.objects.all()
# 指定序列化类,固定写法
serializer_class = BookModelserializer # 只要配置了版本,在视图中就能通过 request.version 获得当前版本号
def get_serializer_class(self):
# 获取当前序列化类的方法
# 根据版本的不同返回不同的序列化类
if self.request.version == 'v1':
return BookSerializerVersion1
return BookModelserializer

自定义

要实现自定义版本控制,请继承 BaseVersioning 并重写 determine_version 方法。

class MyVersion(versioning.BaseVersioning):
def determine_version(self, request, *args, **kwargs):
return request.META.get('version', None)

这样就能在局部或全局使用了!

~>.<~

DRF Django REST framework 之 路由器与版本控制组件(七)的更多相关文章

  1. 轻轻松松学会 DRF Django REST framework

    据我了解,目前的IT行业的大部分后端开发,都是需要进行前后端分离的,而前后端分类必不可少的是rest 规范,以下是django rest framework的学习路径: DRF Django REST ...

  2. Django rest framework(4)----版本

    目录 Django组件库之(一) APIView源码 Django restframework (1) ----认证 Django rest framework(2)----权限 Django res ...

  3. DRF Django REST framework APIView(一)

    什么是REST? REST是一个标准,一种规范,遵循REST风格可以使开发的接口通用,便于调用者理解接口的作用. 使url更容易理解,让增删改清晰易懂,在前后端分离开发中按照这一规范能加快开发效率,减 ...

  4. DRF Django REST framework 之 解析器(二)

    引入 Django Rest framework帮助我们实现了处理application/json协议请求的数据,如果不使用DRF,直接从 request.body 里面拿到原始的客户端请求的字节数据 ...

  5. DRF (Django REST framework) 中的Request 与 Response

    DRF中的Request 与 Response 1. Request - REST framework 传入视图的request对象不再是Django默认的HttpRequest对象,而是REST f ...

  6. DRF (Django REST framework) 中的视图类

    视图说明 1. 两个基类 1)APIView rest_framework.views.APIView APIView是REST framework提供的所有视图的基类,继承自Django的View父 ...

  7. DRF Django REST framework 之 序列化(三)

    Django 原生 serializer (序列化) 导入模块 from django.core.serializers import serialize 获取queryset 对queryset进行 ...

  8. DRF Django REST framework 之 认证组件(五)

    引言 很久很久以前,Web站点只是作为浏览服务器资源(数据)和其他资源的工具,甚少有什么用户交互之类的烦人的事情需要处理,所以,Web站点的开发这根本不关心什么人在什么时候访问了什么资源,不需要记录任 ...

  9. Django REST framework 渲染器、版本

    渲染器.版本: # settings.py REST_FRAMEWORK = { "DEFAULT_RENDERER_CLASSES": [ "rest_framewor ...

随机推荐

  1. Python3.7.1(四) Print如何在输出中插入变量

    # 如果想在打印的字符串中的任意地方加入任意的变量,可以使用python的格式化输出.## 用例代码如下:s = 'Hello'x = len(s)print("The length of ...

  2. C语言入门教程: 一个简单的实例

    对于学习要保持敬畏! 语言不只是一种工具,还是一种资源,因此,善待它,掌握它!   我们知道,对于未知通常都会充满好奇和畏惧,既想了解它,又害怕神秘面纱隐藏的不确定性.对于一门编程语言同样如此,我将以 ...

  3. 024.掌握Pod-部署MongoDB

    一 前期准备 1.1 前置条件 集群部署:Kubernetes集群部署参考003--019. glusterfs-Kubernetes部署:参考<附010.Kubernetes永久存储之Glus ...

  4. NIO流的学习以及Buffer的相关操作

    NIO的使用 一).什么叫NIO? 定义:是一套新的Java I/O标准, 在java1.4中被纳入JDK中. 二).NIO的实现方法 NIO是基于块的, 以块为基本单位处理数据. 标准的I/O是基于 ...

  5. Oracle10g安装步骤(一)

    本例使用安装程序:10201_database_win32 首先将所有文件提取解压出来后,执行setup.exe 安装步骤如下:

  6. Redis面试题详解:哨兵+复制+事务+集群+持久化等

    Redis主要有哪些功能? 1.哨兵(Sentinel)和复制(Replication) Redis服务器毫无征兆的罢工是个麻烦事,如何保证备份的机器是原始服务器的完整备份呢?这时候就需要哨兵和复制. ...

  7. Java流程控制之(三)嵌套

    目录 嵌套循环 for循环嵌套 while循环嵌套 总结 之前谈到各种循环结构,有for循环啊,有while循环啊,可以完成不断重复的动作,相当方便.那么如果好多个循环结合再一次,又是如何实现效果的呢 ...

  8. SSM框架整合 详细步骤(备注) 附源码

    整合思路 将工程的三层结构中的JavaBean分别使用Spring容器(通过XML方式)进行管理. 整合持久层mapper,包括数据源.会话工程及mapper代理对象的整合: 整合业务层Service ...

  9. Python使用百度地图API根据地名获取相应经纬度

    今天有个需求,要根据地名获取经纬度坐标值. 于是我第一想法:打开百度地图,手动输入地名,获取.显然当地名较少时,可实施.然而,当地名较多时,此方法显然工作量很大. 于是,第二想法:代码获取,请求百度地 ...

  10. gganimate|创建可视化动图,让你的图表会说话

    本文首发于“生信补给站”公众号,https://mp.weixin.qq.com/s/kKQ2670FBiDqVCMuLBL9NQ 更多关于R语言,ggplot2绘图,生信分析的内容,敬请关注小号. ...