通过自定义手段来实现后台获取接口版本号,也可以使用drf内置的类实现。如果使用内置的类,直接在REST_FRAMEWORK配置中,配置成内置类即可。
在utils包中新建version.py文件
from rest_framework.versioning import BaseVersioning
class Version(BaseVersioning):
# determine: 确定,确认
def determine_version(self, request, *args, **kwargs):
# 获取此次GET请求的版本号
# query_params:查询字符串
version = request.query_params.get('version')
return version
ORDER_DICT = {
1: {
'name': '鞋子',
'price': 20,
'color': 'red',
'detail': '...',
'type': '普通'
},
2: {
'name': '风扇',
'price': 20,
'color': 'black',
'detail': '...',
'type': '普通'
},
}
from utils.base_authenticate import PTPermission, IPThrottle, UserThrottle
from utils.version import Version
from rest_framework.versioning import QueryParameterVersioning, URLPathVersioning
class OrderView(APIView):
authentication_classes = []
permission_classes = []
# QueryParameterVersioning:通过?version=1来获取版本号,和自定义的Version类功能差不多,但是QueryParameterVersioning提供了一些额外的配置在REST_FRAMEWORK中。
versioning_class = URLPathVersioning
# throttle_classes = [IPThrottle]
def get(self, request, version):
data = {}
# 获取当前版本号
version = request.version
if version == 'v1':
data['results'] = ORDER_DICT
elif version == 'v2':
# request.versioning_scheme: 指的是当前版本类的对象。
url = request.versioning_scheme.reverse(viewname='order', request=request)
data['results'] = {
'goods': [
{'name': '苹果'}, {'name': '香蕉'}
],
'current_url': url
}
return JsonResponse(data)
QueryParameterVersioning用于去GET参数中取version
URLPathVersioning:去url路径里面获取版本
#版本
REST_FRAMEWORK = {
"DEFAULT_VERSION":'v1', #默认的版本
"ALLOWED_VERSIONS":['v1','v2'], #允许的版本
"VERSION_PARAM":'version' #GET方式url中参数的名字 ?version=xxx
}
反向解析访问的url:
path('order/', OrderView.as_view(), name='order'),
源码分析:
dispathch()
determine_version()需要自己定义,返回值为version(版本)
URLPathVersioning源码也可以自己分析分析