8-1 版本-DRF版本

目录:

  • 版本控制介绍
  • 五种版本控制方案
  • URLPathVersioning控制方法
  • 类视图URLPathVersioning控制

一、版本控制介绍

  API版本控制允许我们在不同的客户端之间更改行为(同一个接口的不同版本会返回不同的数据)。DRF提供了许多不同的版本控制方案。可能会有一些客户端因为某些原因已经不再维护了,但是我们后端的接口还是要不断的更新迭代的,这个时候通过版本控制返回不同的内容就是一种不错的解决方案。

  其实说白了,我访问的是同一个视图,但是由于不同的版本,返回的参数是不一样的。那这个是怎么控制的呐?来我们继续往下介绍。

二、五种版本控制方案

版本控制方案,一共有5种,那我们怎么知道这五种的呐?我们就需要,这个时候我们就需要导入BaseVersioning模块,好啦我们一起来看一下吧:

from rest_framework.versioning import BaseVersioning

我们看下源码: Ctrl + BaseVersioning:

class BaseVersioning(object):
    """
    基础版本类
    """

class AcceptHeaderVersioning(BaseVersioning):
    """
    再请求头中
    """

class URLPathVersioning(BaseVersioning):
    """
    在URL中
    """

class NamespaceVersioning(BaseVersioning):
    """
    用namespace
    """


class HostNameVersioning(BaseVersioning):
    """
    通过主机域
    """

class QueryParameterVersioning(BaseVersioning):
    """
    通过URL查询参数
    """

三、URLPathVersioning控制方法

  今天我们主要讲解的是 URLPathVersioning 是如何控制的版本的。

3.1、配置文件

说明:在settings.py的配置文件中,配置版本控制。我们测试的时候用的是全局配置。

#settings.py中全局配置
REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (...), #认证方式
    'DEFAULT_PERMISSION_CLASSES': (...),  #权限控制
    'DEFAULT_THROTTLE_CLASSES': [....], #节流
    'DEFAULT_THROTTLE_RATES': {...},  #限制数
    # 版本
    'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.URLPathVersioning', #采用的是URL方式控制版本
    'DEFAULT_VERSION': 'v1',  # 默认的版本
    'ALLOWED_VERSIONS': ['v1', 'v2'],  # 有效的版本
    'VERSION_PARAM': 'version',  # 版本的参数名与URL conf中一致
}

这个是全局配置,当然你如果需要 局部配置 的话,需要在具体视图中使用:

#具体视图中局部配置
versioning_class = "rest_framework.versioning.URLPathVersioning"  #注意不是列表

3.2、视图

说明:编写views.py,新增一个视图类

class VersionView(APIView):

    def get(self, request, *args, **kwargs):
        #获取版本:v1 或者 v2(全局里面定义)
        print(request.version)
        # 获取版本管理的类: <rest_framework.versioning.URLPathVersioning object at 0x0000016B6F3F9630>
        print(request.versioning_scheme)
        # 反向生成URL: http://127.0.0.1:8000/api/v1/version
        reverse_url = request.versioning_scheme.reverse('version', request=request)   #version是子路由中的name
        print(reverse_url)

        if request.version == "v1":
            ctx = {"code": 1, "msg": "ok", "data": {}}
        else:
            ctx = {"code": 2, "msg": "ok", "data": {}}
        return JsonResponse(ctx)

3.3、路由

说明:在具体app下的路由配置

from django.urls import path
from app05 import views


urlpatterns = [
    path("<str:version>/version", views.VersionView.as_view(), name="version")
]

3.4、postman测试

v1版本:

 

v2版本:

 

v3版本:因为v3版本我们在全局变量中没有定义,所以没有v3版本:

四、类视图URLPathVersioning控制

 上面我用的APIView,写的随意比较大一些,但是我们之前学过类视图,对吧,他里面已经帮我们封装的很好了,那我们咋办呐。哈哈,这个时候我们就需要重写我们的get_queryset方法了:

class GameList(generics.ListCreateAPIView):

    serializer_class = GameSerializer

    def get_queryset(self):   #重写get_queryset方法
        if self.request.version == "v1":
            queryset = Game.objects.filter(status=1).all()
        else:
            queryset = Game.objects.filter(status=0).all()

        return queryset
    
    # def get_serializer_class(self):  #序列化类也是可以支持重写的
    #     pass

这边我们就不带大家测试了。其他的设置都是一样的,除了视图不一样。

posted @ 2020-05-06 13:30  帅丶高高  阅读(204)  评论(1)    收藏  举报