Django REST framework-版本控制

版本控制

QueryParameterVersioning

基于get传参的方式
继承APIView方式

1 在views.py 视图类中配置
from rest_framework.versioning import QueryParameterVersioning
from rest_framework.views import APIView


class Version(APIView):

    def get(self, request, *args, **kwargs):
        # 配置使用的版本类方法
        versioning_class = QueryParameterVersioning
        print(request.version) # 查看版本号
        print(request.versioning_scheme) # 调用详细信息
        return Response() # 返回空值


2 局部使用(视图类中)
    versioning_class = QueryParameterVersioning


3 全局使用:在settings.py配置文件中配置
    REST_FRAMEWORK = {
        'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.URLPathVersioning',
        'DEFAULT_VERSION': 'v1',  # 默认版本(从request对象里取不到,显示的默认值)
        'ALLOWED_VERSIONS': ['v1', 'v2'],  # 允许的版本
        'VERSION_PARAM': 'version'  # URL中获取值的key
    }
4 url配置
from django.urls import path
from app01 import views

    urlpatterns = [
      path('versiontest/', views.Version.as_view()),
    ]


继承GenericAPIView方式

1 在views.py 视图类中配置
from rest_framework.generics import ListAPIView, CreateAPIView
from rest_framework.versioning import QueryParameterVersioning


class VersionView(ViewSetMixin, ListAPIView):
    versioning_class = QueryParameterVersioning
    queryset = models.Book.objects.all()
    serializer_class = serializer.BookSerializer

    def list(self, request, *args, **kwargs):
        print(request.version)
        print(request.versioning_scheme)
        return super().list(request, *args, **kwargs)


2 局部使用(视图类中)
    versioning_class = QueryParameterVersioning


3 全局使用:在settings.py配置文件中配置
    REST_FRAMEWORK = {
        'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.URLPathVersioning',
        'DEFAULT_VERSION': 'v1',  # 默认版本(从request对象里取不到,显示的默认值)
        'ALLOWED_VERSIONS': ['v1', 'v2'],  # 允许的版本
        'VERSION_PARAM': 'version'  # URL中获取值的key
    }

4 url配置
from django.urls import path
from app01 import views
from rest_framework.routers import SimpleRouter

    router = SimpleRouter()
    router.register('version', views.VersionView)
    urlpatterns = [
       path('api/', include(router.urls)), 
    ]

URLPathVersioning

基于正则的方式(推荐)
继承APIview方式

1 在views.py 视图类中配置
from rest_framework.versioning import URLPathVersioning
from rest_framework.views import APIView


class Version(APIView):

    def get(self, request, *args, **kwargs):
        # 配置使用的版本类方法
        versioning_class = URLPathVersioning
        print(request.version) # 查看版本号
        print(request.versioning_scheme) # 调用详细信息
        return Response() # 返回空值


2 局部使用(视图类中)
  versioning_class = URLPathVersioning


3 全局使用:在settings.py配置文件中配置
    REST_FRAMEWORK = {
        'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.URLPathVersioning',
        'DEFAULT_VERSION': 'v1',  # 默认版本(从request对象里取不到,显示的默认值)
        'ALLOWED_VERSIONS': ['v1', 'v2'],  # 允许的版本
        'VERSION_PARAM': 'version'  # URL中获取值的key
    }

4 url配置
from django.urls import path
from app01 import views


  urlpatterns = [
    path('<str:version>/versiontest/', views.Version.as_view()),
  ]


继承GenericAPIView方式

1 在views.py 视图类中配置
from rest_framework.generics import ListAPIView, CreateAPIView
from rest_framework.versioning import URLPathVersioning

class VersionViews(ViewSetMixin, ListAPIView):
    # 配置使用的版本类方法
    versioning_class = URLPathVersioning
    queryset = models.Book.objects.all()
    serializer_class = serializer.BookSerializer

    def list(self, request, *args, **kwargs):
        print(request.version)
        print(request.versioning_scheme)
        return super().list(request, *args, **kwargs)


2 局部使用(视图类中)
    versioning_class = URLPathVersioning


3 全局使用:在settings.py配置文件中配置
    REST_FRAMEWORK = {
        'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.URLPathVersioning',
        'DEFAULT_VERSION': 'v1',  # 默认版本(从request对象里取不到,显示的默认值)
        'ALLOWED_VERSIONS': ['v1', 'v2'],  # 允许的版本
        'VERSION_PARAM': 'version'  # URL中获取值的key
    }


4 url配置
from django.urls import path
from app01 import views
from rest_framework.routers import SimpleRouter

    router = SimpleRouter()
    router.register('versions', views.VersionViews)

    urlpatterns = [
      path('api/<str:version>/', include(router.urls)),
    ]

AcceptHeaderVersioning

基于请求头的
继承APIview方式

1 在views.py 视图类中配置
from rest_framework.views import APIView
from rest_framework.versioning import AcceptHeaderVersioning

class Version(APIView):

    def get(self, request, *args, **kwargs):
        versioning_class = AcceptHeaderVersioning
        print(request.version) # 打印版本号
        print(request.versioning_scheme) # 调用详细信息
        return Response() # 返回空值

2 局部使用(视图类中)
    versioning_class = AcceptHeaderVersioning


3 全局使用:在settings.py配置文件中配置
    REST_FRAMEWORK = {
        'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.URLPathVersioning',
        'DEFAULT_VERSION': 'v1',  # 默认版本(从request对象里取不到,显示的默认值)
        'ALLOWED_VERSIONS': ['v1', 'v2'],  # 允许的版本
        'VERSION_PARAM': 'version'  # URL中获取值的key
    }


4 url配置
from django.urls import path
from app01 import views

  urlpatterns = [
      path('versiontest/', views.Version.as_view()),
  ]


继承GenericAPIView方式

1 在views.py 视图类中配置
from rest_framework.generics import ListAPIView, CreateAPIView
from rest_framework.versioning import AcceptHeaderVersioning


class VersionView(ViewSetMixin, ListAPIView):
    versioning_class = AcceptHeaderVersioning
    queryset = models.Book.objects.all()
    serializer_class = serializer.BookSerializer

    def list(self, request, *args, **kwargs):
        print(request.version)
        print(request.versioning_scheme)
        return super().list(request, *args, **kwargs)


2 局部使用(视图类中)
    versioning_class = AcceptHeaderVersioning


3 全局使用:在settings.py配置文件中配置
    REST_FRAMEWORK = {
        'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.URLPathVersioning',
        'DEFAULT_VERSION': 'v1',  # 默认版本(从request对象里取不到,显示的默认值)
        'ALLOWED_VERSIONS': ['v1', 'v2'],  # 允许的版本
        'VERSION_PARAM': 'version'  # URL中获取值的key
    }


4 url配置
from django.urls import path
from app01 import views
from rest_framework.routers import SimpleRouter

    router = SimpleRouter()
    router.register('version', views.VersionView)
    
    urlpatterns = [
        path('api/', include(router.urls)),
    ]

posted @ 2022-01-17 17:16  沈忻凯  阅读(92)  评论(0)    收藏  举报