为了方便版本管理,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',
'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 = [
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')
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通