# from rest_framework.versioning import * 提供了 5 中方式 具体可以从源码中查看
URLPathVersioning 使用方式
# setting
REST_FRAMEWORK = {
'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.URLPathVersioning',
'DEFAULT_VERSION': 'v1', # 默认的版本
'ALLOWED_VERSIONS': ['v1', 'v2'], # 有效的版本
'VERSION_PARAM': 'version', # 版本的参数名与 URL conf中一致
}
# 视图
class VersionView(APIView):
def get(self, request, *args, **kwargs):
print(request.version)
if request.version == 'v1':
ctx = {"code": 1, "msg": "ok", "data": {}}
return JsonResponse(ctx)
else:
ctx = {"code": 2, "msg": "ok", "data": {}}
return JsonResponse(ctx)
# 类视图
class GameList(generics.ListCreateAPIView):
serializer_class = GameSerializer
# 版本过滤
def get_queryset(self):
if self.request.version == 'v1':
queryset = Game.objects.filter(status=1).all()
else:
queryset = Game.objects.filter(status=0).all()
return queryset
# 也可以重写序列化类
# def get_serializer_class(self):
# url 通用视图 配置方式
router = DefaultRouter()
router.register(r'students', views.StudentViewSet)
router.register(r'groups', views.GroupViewSet)
router.register(r'games', app04.GameViewSet)
urlpatterns = [
path('api/<str:version>/', include(router.urls)),
path('api/<str:version>/', include(('app06.urls', 'app06'), namespace='app06')),
......
]
# app url配置
urlpatterns = [
path('carts/', views.CartView.as_view(), name='cart-list'),
path('login/', views.LoginView.as_view(), name='login'),
path('version/', views.VersionView.as_view(), name='version'),
]
#用法
http://127.0.0.1:8003/app05/v2/carts/
http://127.0.0.1:8003/app05/v2/version/
#-------------------------------------------------------------------------
# 版本 配置到 app url也可以
urlpatterns = [
path('carts/', views.CartView.as_view(), name='cart-list'),
path('login/', views.LoginView.as_view(), name='login'),
path('<str:version>/version/', views.VersionView.as_view(), name='version'),
]
# 用法
http://127.0.0.1:8003/app05/carts/
http://127.0.0.1:8003/app05/v2/version/