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'}
本文来自博客园,仅供参考学习,如有不当之处还望不吝赐教,不胜感激!转载请注明原文链接:https://www.cnblogs.com/rong-z/articles/10727102.html
作者:cnblogs用户
浙公网安备 33010602011771号