1.REST framework版本控制的流程分析
1.1 determine_version方法的执行流程
首先,请求到达REST framework
的CBV,执行CBV中的dispatch
方法再次封装完成request后,执行initial
方法.
在REST framework
中的版本控制就是在initial
函数中调用determine_version
方法完成的
来看看源码
initial
方法的源码:
def initial(self, request, *args, **kwargs):
"""
Runs anything that needs to occur prior to calling the method handler.
"""
self.format_kwarg = self.get_format_suffix(**kwargs)
# Perform content negotiation and store the accepted info on the request
neg = self.perform_content_negotiation(request)
request.accepted_renderer, request.accepted_media_type = neg
# Determine the API version, if versioning is in use.
version, scheme = self.determine_version(request, *args, **kwargs)
request.version, request.versioning_scheme = version, scheme
# Ensure that the incoming request is permitted
self.perform_authentication(request)
self.check_permissions(request)
self.check_throttles(request)
determine_version
方法的源码
def determine_version(self, request, *args, **kwargs):
if self.versioning_class is None: # 如果versioning_class为空则返回一个None的元组
return (None, None)
scheme = self.versioning_class()
return (scheme.determine_version(request, *args, **kwargs), scheme)
determine_version
方法中的versioning_class
方法又是从哪里来的呢
1.2 versioning_class的由来
在UserView视图函数中没有定义versioning_class,那就要到UserView的父类APIView中去找
在APIView类中定义了versioning_class的信息
class APIView(View):
renderer_classes = api_settings.DEFAULT_RENDERER_CLASSES
parser_classes = api_settings.DEFAULT_PARSER_CLASSES
authentication_classes = api_settings.DEFAULT_AUTHENTICATION_CLASSES
throttle_classes = api_settings.DEFAULT_THROTTLE_CLASSES
permission_classes = api_settings.DEFAULT_PERMISSION_CLASSES
content_negotiation_class = api_settings.DEFAULT_CONTENT_NEGOTIATION_CLASS
metadata_class = api_settings.DEFAULT_METADATA_CLASS
versioning_class = api_settings.DEFAULT_VERSIONING_CLASS
在视图函数中打印versioning_class
None
可以看到默认设置的versioning_class的值是None
,这说明我们可以在视图函数中为versioning_class设置一个值
在detemi