| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 
 | class URLPathVersioning(BaseVersioning):"""
 To the client this is the same style as `NamespaceVersioning`.
 The difference is in the backend - this implementation uses
 Django's URL keyword arguments to determine the version.
 
 An example URL conf for two views that accept two different versions.
 可以看到版本信息就在url中
 urlpatterns = [
 url(r'^(?P<version>[v1|v2]+)/users/$', users_list, name='users-list'),
 url(r'^(?P<version>[v1|v2]+)/users/(?P<pk>[0-9]+)/$', users_detail, name='users-detail')
 ]
 
 GET /1.0/something/ HTTP/1.1
 Host: example.com
 Accept: application/json
 """
 invalid_version_message = _('Invalid version in URL path.')
 
 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
 
 def reverse(self, viewname, args=None, kwargs=None, request=None, format=None, **extra):
 if request.version is not None:
 kwargs = {} if (kwargs is None) else kwargs
 
 kwargs[self.version_param] = request.version
 
 return super().reverse(
 viewname, args, kwargs, request, format, **extra
 
 |