Django-rest-framework 接口实现 版本控制 versioning
版本控制
rest_framework 提供了 5 种版本控制 以及对应的 写法 url的 更改都可以
在 from rest_framework import versioning
中查看
-
AcceptHeaderVersioning
将版本信息放在请求头中URLPathVersioning
将版本信息放在url路由中 ----常用NamespaceVersioning
通过namespace 来区分版本HostNameVersioning
通过主机名来区分版本QueryParameterVersioning
通过URL参数来区分版本 ----常用
以URLpathVersioning
为例来定义
-
在 项目的 settings.py 中配置版本信息
REST_FRAMEWORK = { ... # 使用那种版本控制来控制版本号 'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.URLPathVersioning', 'DEFAULT_VERSION': 'v1', # 默认的版本 'ALLOWED_VERSIONS': ['v1', 'v2'], # 有效的版本 'VERSION_PARAM': 'version', # 版本的参数名与URL conf中一致 }
-
在url 路由中 做出对应的 修改
# 路由需要加上 (?P<version>[v1|v2]+)/ 的前缀 命名不能错 version 不然视图中无法获取到 版本号 urlpatterns = [ ... url(r'^(?P<version>[v1|v2]+)/publishers/$', views.PublisherView.as_view({'get': 'list', 'post': 'create'})), url(r'^(?P<version>[v1|v2]+)/publishers/(?P<pk>\d+)/$', views.PublisherView.as_view({'get': 'retrieve', 'put': 'update', 'delete': 'destroy'})), ]
-
在视图中获取版本号
- 通过访问
request.version
来获取当前请求的具体版本
from rest_framework.generics import ListCreateAPIView, RetrieveUpdateDestroyAPIView class PublisherView(ListCreateAPIView): """查看列表和创建""" queryset = models.Publisher.objects.all() serializer_class = PublisherModelSerializer def get_serializer_class(self): """不同的版本使用不同的序列化类""" if self.request.version == 'v1': # 获取版本号 return PublisherModelSerializerVersion1 else: return PublisherModelSerializer def get_queryset(self): """不同的版本返回不同的数据""" if self.request.version == 'v1': # 获取版本号 return models.Publishr.objects.filter(id=4) else: return self.queryset
- 通过访问
-
局部配置版本信息
一般不使用
# 写在要对应的 视图中 versioning_class = URLPathVersioning