rest-framework版本控制

一、官网地址

二、获取版本号有很多种,

  • 1、在url上使用query的方式(?version=v1)
  • 2、在url上使用path方式
  • 3、可以在请求头中加上
  • 4、在请求参数的时候带上

三、直接在实体类中request中获取到版本号

  • 1、前面我们介绍restfull规范的时候就讲到一个版本的

  • 2、url地址http://127.0.0.1:8000/app01/api/v1/user/?token=1ea94bc978147f46c402c238e5adaf07&version=v1

  • 3、直接在视图中获取版本号

    class UserView(APIView):
        permission_classes = []
        authentication_classes = []
    
        def get(self, request, *args, **kwargs):
            print(request.GET.get('version'))
            print(request._request.GET.get('version'))
            print(request.query_params.get('version'))
            return HttpResponse('用户信息')
    

四、单独定义一个类来使用query方式实现获取版本

  • 1、定义类

    class ParamVersion(object):
      def determine_version(self, request, *args, **kwargs):
          # 这个地方也可以使用request.GET.get()
          # 只是rest-framework中在Request类中封装了(可以查看源码)
          version = request.query_params.get('version')
          return version
    
  • 2、在类中使用

    class UserView(APIView):
        permission_classes = []
        authentication_classes = []
        # 使用刚刚定义的类
        versioning_class = ParamVersion
    
        def get(self, request, *args, **kwargs):
            # 上面使用了versioning_class=类名,就会把version放到request中
            print(request.version)
            return HttpResponse('用户信息')
    

四、直接使用内置版本

  • 1、实现代码

    from rest_framework.versioning import QueryParameterVersioning
    
    class UserView(APIView):
        permission_classes = []
        authentication_classes = []
        versioning_class = QueryParameterVersioning
    
        def get(self, request, *args, **kwargs):
            # 如果没在配置文件中配置就默认是version
            print(request.version)
            return HttpResponse('用户信息')
    
  • 2、配置文件中配置版本名称及版本号

REST_FRAMEWORK = {
    'DEFAULT_VERSION': 'v1',
    'ALLOWED_VERSIONS': ['v1', 'v2'],
    'VERSION_PARAM': 'version'
}

五、在配置文件中进行全局配置版本

  • 1、settings.py中配置

    REST_FRAMEWORK = {
        'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.QueryParameterVersioning',
        'DEFAULT_VERSION': 'v1',
        'ALLOWED_VERSIONS': ['v1', 'v2'],
        'VERSION_PARAM': 'version'
    }
    
  • 2、使用了上面的全局方式配置后就不需要在视图类中进行配置了

六、使用path的方式配置版本

  • 1、设置url

    urlpatterns = [
        ...
        path('<str:version>/user/', user.User1View.as_view())
    ]
    
  • 2、url地址http://127.0.0.1:8000/app01/api/v1/user/

  • 3、视图类中获取path中的版本号

    class User1View(APIView):
        permission_classes = []
        authentication_classes = []
    
        def get(self, request, *args, **kwargs):
            print(kwargs)
            return HttpResponse('版本号{0}'.format(kwargs.get('version')))
    

七、使用rest-framework内置的方法配置path获取版本号

  • 1、导包

    from rest_framework.versioning import URLPathVersioning
    
  • 2、url配置和上面一样的

  • 3、视图类中使用URLPathVersioning

    from rest_framework.versioning import URLPathVersioning
    
    class User1View(APIView):
        permission_classes = []
        authentication_classes = []
    
        versioning_class = URLPathVersioning
    
        def get(self, request, *args, **kwargs):
            print(kwargs)
            print(request.version)
            return HttpResponse('版本号{0}'.format(kwargs.get('version')))
    

八、全局配置path的方式

  • 1、在settings.py中配置

    REST_FRAMEWORK = {
        'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.URLPathVersioning',
        'DEFAULT_VERSION': 'v1',
        'ALLOWED_VERSIONS': ['v1', 'v2'],
        'VERSION_PARAM': 'version'
    }
    
  • 2、在视图类中就可以不需要使用

results matching ""

    No results matching ""