drf之版本控制

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',}
希望你眼眸有星辰,心中有山海,从此以梦为马,不负韶华
原文地址:https://www.cnblogs.com/daviddd/p/11918464.html