为了方便版本管理,drf为我们提供了5个版本管理类
- QueryParameterVersioning (将版本信息以URL参数的形式传递)
- URLPathVersioning (将版本信息以URL路径形式传递)
- AcceptHeaderVersioning (将版本信息以请求头的形式传递)
- HostNameVersioning (将版本信息以域名的方式传递,几乎不用)
- NamespaceVersioning (将版本信息以别名定义,通过分发到同一视图,可以实现,几乎不用)
1.QueryParameterVersioning
源码分析:
class QueryParameterVersioning(BaseVersioning): #如果要配置版本的参数,可以通过他的父类去查看需要配置的参数名
"""
GET /something/?version=0.1 HTTP/1.1
Host: example.com
Accept: application/json
"""
invalid_version_message = _('Invalid version in query parameter.')
def determine_version(self, request, *args, **kwargs):
version = request.query_params.get(self.version_param, self.default_version)
if not self.is_allowed_version(version):
raise exceptions.NotFound(self.invalid_version_message)
return version
#版本管理的父类,配置的参数看该类的参数
class BaseVersioning:
default_version = api_settings.DEFAULT_VERSION # 如果不传入版本号,默认的版本号
allowed_versions = api_settings.ALLOWED_VERSIONS # 仅支持的所有版本,列表的形式,如果版本号不在里面,会报错,可不配置
version_param = api_settings.VERSION_PARAM # 版本的参数名
def determine_version(self, request, *args, **kwargs):
msg = '{cls}.determine_version() must be implemented.'
raise NotImplementedError(msg.format(
cls=self.__class__.__name__
))
配置文件中settings.py的配置
REST_FRAMEWORK = {
'VERSION_PARAM':'v', #版本号的参数名,可以任意配置,不配置默认参数名为version
'DEFAULT_VERSION':"V1",#默认的版本号,可以不配置
"ALLOWED_VERSIONS":["v1","v2","v3"] #可以配置仅支持的版本,如果版本不在这里,会抛出异常
#配置该类后,就不用再视图函数中声明了,不过视图函数的优先级高于配置文件
'DEFAULT_VERSION_CLASS':"from rest_framework.versioning.QueryParameterVersioning"
}
视图函数Viwes.py代码示例:
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.versioning import QueryParameterVersioning
class StudentViewSet(APIView):
versioning_class = QueryParameterVersioning
def get(self,request,*args,**kwargs):
print(request.version)
return Response('ok')
路由文件urls.py的代码示例:
from django.urls import path
from student.views import StudentViewSet
urlpatterns = [
path('info/',StudentViewSet.as_view())
]
2.URLPathVersioning
- 用法基本与上面的类一样,只不过urls.py的写法不同
from django.urls import path
from student.views import StudentViewSet
urlpatterns = [
# 这样的URL方式,与正则re_path方法相似,只是写法不同,url中的参数,还是会传递到 **kwargs中,
#可以通过request.query_params获取
# <str:version>的中的参数version必现与配置文件一致
path('info/<str:version>/',StudentViewSet.as_view())
]
- 与 URLPathVersioning 类不同,URL中不用携带
- 配置文件中依然可以配置
- 不过在发送请求时,需要将版本参数和版本信息以请求头的信息携带发送
示例图片:
![]()
视图函数views.py代码示例
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.versioning import AcceptHeaderVersioning
class StudentViewSet(APIView):
versioning_class = AcceptHeaderVersioning
def get(self,request,*args,**kwargs):
print(request.version)
return Response('ok')