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. 基于子域名