• Django REST framework 版本控制


    DRF的版本控制

    为什么需要版本控制

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

    可能会有一些客户端因为某些原因不再维护了,但是我们后端的接口还要不断的更新迭代,这个时候通过版本控制返回不同的内容就是一种不错的解决方案。

    DRF提供的版本控制方案

    rest_framework.versioning提供了五种版本控制方案,如下图:

     

    版本控制系统的使用

    全局配置

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

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

    urls.py中

    urlpatterns = [
        ...
        url(r'^(?P<version>[v1|v2]+)/publishers/$', views.PublisherViewSet.as_view({'get': 'list', 'post': 'create'})),
        url(r'^(?P<version>[v1|v2]+)/publishers/(?P<pk>d+)/$', views.PublisherViewSet.as_view({'get': 'retrieve', 'put': 'update', 'delete': 'destroy'})),
    
    ]

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

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

    class PublisherViewSet(ModelViewSet):
      queryset = models.Publisher.objects.all()
         serializer_class = PublisherModelSerializer   
    
        def get_serializer_class(self):
            """获取当前序列化类的方法"""
            """不同的版本使用不同的序列化类"""
            if self.request.version == 'v1':   
                return PublisherModelSerializerVersion1  # 这里为定义返回的对象的信息
            else:
                return PublisherModelSerializer

     

    局部配置

    注意,通常我们是不会单独给某个视图设置版本控制的,如果你确实需要给单独的视图设置版本控制,你可以在视图中设置versioning_class属性,如下:

    from rest_framework.versioning import URLPathVersioning
    
    class PublisherViewSet(ModelViewSet):
    
        ...
        versioning_class = URLPathVersioning

     补充

    设置  QueryParameterVersioning

    访问方式:127.0.0.1:8000:***/books/?version=v1        在URL上添加参数访问

    设置   URLPathVersioning

    访问方式:127.0.0.1:8000:v1/books/ 

    在视图中就能通过 request.version
  • 相关阅读:
    安装并运行Nacos
    为什么浏览器记住密码会影响表单?
    Oracle数据库的函数
    前端axios传递一个包含数组的对象到后台,后台可以用String接收,也可以用List集合接收
    文字链接Link
    DatePicker日期选择器的使用
    前端解决查询慢的问题
    【华为云技术分享】自动驾驶网络系列四:我们谈自动驾驶网络到底在谈什么?
    【华为云技术分享】低代码开发平台发展趋势:低代码——炒作还是趋势?
    【华为云技术分享】【昇腾】ModelArts与Atlas 200 DK云端协同开发——行人检测Demo(提供完整Demo)
  • 原文地址:https://www.cnblogs.com/zpf666/p/10279379.html
Copyright © 2020-2023  润新知