drf总流程链接
https://www.cnblogs.com/daviddd/p/11918405.html
drf之版本控制
'''
承接rest_framework主流程5.1内容,
视图函数在rest_framework的views.py文件中
drf版本控制,需要APIView基类的静态属性
'''
class APIView(View):
# settings配置文件
versioning_class = api_settings.DEFAULT_VERSIONING_CLASS
settings = api_settings
schema = DefaultSchema()
def initial(self, request, *args, **kwargs):
# 5.1,版本信息
# Determine the API version, if versioning is in use.
version, scheme = self.determine_version(request, *args, **kwargs)
request.version, request.versioning_scheme = version, scheme
# 5.12,执行determine_version函数
def determine_version(self, request, *args, **kwargs):
"""
If versioning is being used, then determine any API version for the
incoming request. Returns a two-tuple of (version, versioning_scheme)
"""
if self.versioning_class is None:
return (None, None)
# 5.13
'''
根据settings配置文件中或者自定义的versioning_class,实例化对象URLPathVersioning()
from rest_framework.versioning import URLPathVersioning
'''
scheme = self.versioning_class()
# 5.14
'''
执行类URLPathVersioning中的 determine_version()方法,
在这里获取到scheme就是api_settings.DEFAULT_VERSIONING_CLASS,
系统默认版本控制类,那scheme.determine_version(request, *args, kwargs)
就是该类下的一个方法查看rest_framework库的一个自带类中的determine_version方法
'''
return (scheme.determine_version(request, *args, **kwargs), scheme)
# 5.15,
'''
这是URLPathVersioning类中的determine_version()方法
返回的是版本号。于是version, scheme分别是版本号和一个版本控制类,
并分别赋值给request对象的version, versioning_scheme属性
'''
def determine_version(self, request, *args, **kwargs):
version = kwargs.get(self.version_param, self.default_version)
if version is None:
version = self.default_version
if not self.is_allowed_version(version):
raise exceptions.NotFound(self.invalid_version_message)
return version
配置文件
REST_FRAMEWORK = {
#版本类
"DEFAULT_VERSIONING_CLASS": 'rest_framework.versioning.URLPathVersioning',
#版本号
"ALLOWED_VERSIONS": ['v1', 'v2'],
#路由后缀名
"VERSION_PARAM": 'version',}