restful版本控制

通过URL传参

通过浏览器访问:http://127.0.0.1:8000/test/?version=v1

views.py

from django.shortcuts import HttpResponse
from rest_framework.views import APIView


class Version(APIView):
    def get(self, request, *args, **kwargs):
        version = request.GET.get('version')
        print(version)
        return HttpResponse('ok')

或者可以自定义类

views.py

from django.shortcuts import HttpResponse
from rest_framework.views import APIView


class ParmeVersion(object):
    def determine_version(self, request, *args, **kwargs):
        version = request.query_params.get('version')
        return version


class Version(APIView):
    versioning_class = ParmeVersion

    def get(self, request, *args, **kwargs):
        print(request.version)
        return HttpResponse('ok')

或者直接使用内置的QueryParameterVersioning,不使用自己的配置则使用默认的配置

views.py

from django.shortcuts import HttpResponse
from rest_framework.views import APIView
from rest_framework.versioning import QueryParameterVersioning


class Version(APIView):
    versioning_class = QueryParameterVersioning

    def get(self, request, *args, **kwargs):
        print(request.version)
        return HttpResponse('ok')  

settings.py

REST_FRAMEWORK = {
    'DEFAULT_VERSION': 'v1',            # 默认版本
    'ALLOWED_VERSIONS': ['v1', 'v2'],   # 允许版本
    'VERSION_PARAM': 'version',         # 参数名称
}

通过URL路径

通过浏览器访问:http://127.0.0.1:8000/v2/test/

urls.py

from django.conf.urls import url
from app1 import views
urlpatterns = [
    url(r'^(?P<version>[v1|v2]+)/test/', views.Version.as_view()),
]

views.py

from django.shortcuts import HttpResponse
from rest_framework.views import APIView
from rest_framework.versioning import URLPathVersioning


class Version(APIView):
    versioning_class = URLPathVersioning

    def get(self, request, *args, **kwargs):
        print(request.version)
        return HttpResponse('ok')

或者直接设置为全局配置

REST_FRAMEWORK = {
    'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.URLPathVersioning',  # 默认读取的类
    'DEFAULT_VERSION': 'v1',            # 默认版本
    'ALLOWED_VERSIONS': ['v1', 'v2'],   # 允许版本
    'VERSION_PARAM': 'version',         # 参数名称
}

配置完之后视图函数中就可以删除这一行:versioning_class = URLPathVersioning

反向生成URL

使用restful的reverse反向生成路由

views.py

from django.shortcuts import HttpResponse
from rest_framework.views import APIView


class Version(APIView):

    def get(self, request, *args, **kwargs):
        # 获取版本
        print(request.version)
        # 获取处理版本的对象
        print(request.versioning_scheme)
        # 反向生成URL,不用传路由的有名分组参数,只需要传一个request即可
        url = request.versioning_scheme.reverse(viewname='test', request=request)
        print(url)
        return HttpResponse('ok')

urls.py

from django.conf.urls import url
from app1 import views
urlpatterns = [
    url(r'^(?P<version>[v1|v2]+)/test/', views.Version.as_view(), name='test'),
]

或者通过django的reverse也可以反向生成URL,只不过需要手动传参kwargs={‘version’:'v2'}

 

posted @ 2019-04-17 23:49  cnblogs用户  阅读(479)  评论(0)    收藏  举报