DRF - 版本
自定义类实现:
views.py:
from django.shortcuts import HttpResponse
from rest_framework.views import APIView
from rest_framework.versioning import BaseVersioning
""" 自定义类实现版本 """
class MyVersion(BaseVersioning):
def determine_version(self, request, *args, **kwargs):
# 获取 version 参数的值
version = request.query_params.get("version")
return version
class UserView(APIView):
versioning_class = MyVersion # 设置版本类
def get(self, request, *args, **kwargs):
print(request.version) # 打印版本
return HttpResponse("用户列表")
访问 /user/?version=v3

内置类实现:
settings.py 中进行默认的配置
REST_FRAMEWORK = {
# 设置全局的版本类
"DEFAULT_VERSIONING_CLASS": "rest_framework.versioning.QueryParameterVersioning",
# 设置默认的版本
"DEFAULT_VERSION": "v1",
# 设置有哪些版本
"ALLOWED_VERSIONS": ["v1", "v2", ],
# 设置版本的访问参数,默认为 version
"VERSION_PARAM": "ver",
}
1. 通过所 get 请求所传递的参数获取版本
views.py:
from django.shortcuts import HttpResponse
from rest_framework.views import APIView
from rest_framework.versioning import QueryParameterVersioning
class OrderView(APIView):
# 设置局部视图类
versioning_class = QueryParameterVersioning
def get(self, request, *args, **kwargs):
# 获取版本
print(request.version)
# 获取版本的对象
# print(request.versioning_scheme)
return HttpResponse("订单页面")
访问 /order/,返回的是 settings.py 中设置默认的版本 v1

访问 /order/?ver=v2,返回的是 v2

访问 /order/?ver=v3,报错

此时并不会使用默认的版本值
2. 通过 URL 路径获取版本
在 urls.py 中进行路径的正则匹配
from django.urls import re_path
from drf import views
urlpatterns = [
re_path(r'^(?P<ver>[v1|v2]+)/order/$', views.OrderView.as_view()),
]
views.py:
from django.shortcuts import HttpResponse
from rest_framework.views import APIView
from rest_framework.versioning import URLPathVersioning
class OrderView(APIView):
# 设置局部视图类
versioning_class = URLPathVersioning
def get(self, request, *args, **kwargs):
# 获取版本
print(request.version)
# 获取版本的对象
# print(request.versioning_scheme)
return HttpResponse("订单页面")
分别访问 /v1/order/ 和 /v2/order/

因为在正则中将允许的版本写死了,所以访问其他的版本会报 404
3. 反向生成 URL
urls.py:
from django.urls import re_path
from drf import views
urlpatterns = [
# name 是设置别名
re_path(r'^(?P<ver>[v1|v2]+)/order/$', views.OrderView.as_view(), name="orderlist"),
]
views.py:
from django.shortcuts import HttpResponse
from rest_framework.views import APIView
from rest_framework.versioning import URLPathVersioning
from django.urls import reverse
class OrderView(APIView):
# 设置局部视图类
versioning_class = URLPathVersioning
def get(self, request, *args, **kwargs):
# 基于 Rest Framework 的反向生成 URL
u1 = request.versioning_scheme.reverse(viewname="orderlist", request=request)
print(u1)
# 基于 Django 的反向生成 URL
u2 = reverse(viewname="orderlist", kwargs={"ver": "v1"})
print(u2)
return HttpResponse("订单页面")
访问 /v2/order/

其他的内置类
1. 基于请求头

2. 基于子域名


浙公网安备 33010602011771号