djanog为我们提供了五中版本的跟新的方法
- 路由路劲
- 域名更新
- 通过路由传参
- 通过请求头里面
- 别名
下面采用的是通过路由的路径
在setting里面进行配置
REST_FRAMEWORK = {
# 版本
'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.URLPathVersioning',
'DEFAULT_VERSION': 'v1', # 默认的版本
'ALLOWED_VERSIONS': ['v1', 'v2'], # 有效的版本
'VERSION_PARAM': 'version', # 版本的参数名与URL conf中一致
}
- 添加路由
# 参数必须和setting里面的VERSION_PARAM值一样
path('<str:version>/version/', Service.as_view(), name='version')
- 视图
class Service(APIView):
# 通过request.version来获取版本号
def get(self,request,*args,**kwargs):
if request.version =='v1':
ctx = {
'code':1,
'msg':'ok',
'data':{}
}
else:
ctx = {
'code': 2,
'msg': 'ok',
'data': {}
}
return JsonResponse(ctx)
类试图的版本控制
当我们使用类试图的是时候,我们获取版本号是,需要自己在视图里重写get_queryset方法
在setting里面进行配置
REST_FRAMEWORK = {
# 版本
'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.URLPathVersioning',
'DEFAULT_VERSION': 'v1', # 默认的版本
'ALLOWED_VERSIONS': ['v1', 'v2'], # 有效的版本
'VERSION_PARAM': 'version', # 版本的参数名与URL conf中一致
}
# view
class GameList(generics.ListCreateAPIView):
serializer_class = GameSerializer
def get_queryset(self):
print(self.request.version)
if self.request.version == 'v1':
queryset = Game.objects.filter(status=1).all()
return queryset
else:
queryset = Game.objects.filter(status == 0).all()
return queryset
# 根级路由
path('api/<str:version>/',include(('app07.urls','app07'))),
# 应用级路由
urlpatterns = [
path('games/',GameList.as_view(),name='game-list'),
path('games/<int:id>/',GameDetail.as_view(),name='game-detail')
]