Django-rest-framework 接口实现 版本控制 versioning

版本控制

rest_framework 提供了 5 种版本控制 以及对应的 写法 url的 更改都可以

from rest_framework import versioning 中查看

  • AcceptHeaderVersioning 将版本信息放在请求头中

    URLPathVersioning 将版本信息放在url路由中 ----常用

    NamespaceVersioning 通过namespace 来区分版本

    HostNameVersioning 通过主机名来区分版本

    QueryParameterVersioning 通过URL参数来区分版本 ----常用

URLpathVersioning 为例来定义

  1. 在 项目的 settings.py 中配置版本信息

    REST_FRAMEWORK = {
        ...
        # 使用那种版本控制来控制版本号
        'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.URLPathVersioning',
        'DEFAULT_VERSION': 'v1',  # 默认的版本
        'ALLOWED_VERSIONS': ['v1', 'v2'],  # 有效的版本
        'VERSION_PARAM': 'version',  # 版本的参数名与URL conf中一致
    }
  2. 在url 路由中 做出对应的 修改

    # 路由需要加上  (?P<version>[v1|v2]+)/  的前缀  命名不能错  version  不然视图中无法获取到 版本号
    urlpatterns = [
        ...
        url(r'^(?P<version>[v1|v2]+)/publishers/$', views.PublisherView.as_view({'get': 'list', 'post': 'create'})),
        url(r'^(?P<version>[v1|v2]+)/publishers/(?P<pk>\d+)/$', views.PublisherView.as_view({'get': 'retrieve', 'put': 'update', 'delete': 'destroy'})),
    
    ]
  3. 在视图中获取版本号

    • 通过访问 request.version 来获取当前请求的具体版本
    from rest_framework.generics import ListCreateAPIView, RetrieveUpdateDestroyAPIView
    
    
    class PublisherView(ListCreateAPIView):
     """查看列表和创建"""
        queryset = models.Publisher.objects.all()
        serializer_class = PublisherModelSerializer
    
        def get_serializer_class(self):
            """不同的版本使用不同的序列化类"""
            if self.request.version == 'v1':  #  获取版本号  
                return PublisherModelSerializerVersion1
            else:
                return PublisherModelSerializer
    
        def get_queryset(self):
             """不同的版本返回不同的数据"""
            if self.request.version == 'v1':  #  获取版本号  
                return models.Publishr.objects.filter(id=4)
            else:
                return self.queryset
  4. 局部配置版本信息

    一般不使用

    # 写在要对应的  视图中
    versioning_class = URLPathVersioning

猜你喜欢

转载自www.cnblogs.com/zhang-zi-yi/p/10447368.html