1. settings.py
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': ['api.authenticate.StudentAuthenticate'],
'DEFAULT_PERMISSOIN_CLASSES': ['api.permission.GradeOnePermisson'],
'UNAUTHENTICATED_USER': None, # request.user
'UNAUTHENTICATED_TOKEN': None, # request.auth
'DEFAULT_THROTTLE_CLASSES': ['api.throttle.StudentThrottle', 'api.throttle.AnonymousThrottle'],
'DEFAULT_THROTTLE_RATES': {
'anonymous': '2/m',
'student': '5/m',
},
'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.URLPathVersioning',
'DEFAULT_VERSION': 'v1',
'ALLOWED_VERSIONS': ['v1', 'v2', 'v3'],
'VERSION_PARAM': 'version',
}
2. urls.py
from django.contrib import admin
from django.urls import path
from django.conf.urls import url, include
urlpatterns = [
path('admin/', admin.site.urls),
# url(r'^api/v1/', include('api.urls')),
url(r'^api/', include('api.urls', namespace='api')),
]
3. api/urls.py
# -*- coding: utf8 -*-
from django.conf.urls import url
from .views import AuthView, TokenView, VersionView
app_name = 'api'
urlpatterns = [
url(r'auth/', AuthView.as_view()),
url(r'version/token/', TokenView.as_view({'get': 'get'}), name='version'),
url(r'(?P<version>[v1|v2|v3]+)/token/$', TokenView.as_view({'get': 'get'}), name='version'),
]
4 api/views.py
from api.authenticate import StudentAuthenticate
from api.permission import GradeOnePermission
from api.serializers import StudentSerializer
from rest_framework.versioning import QueryParameterVersioning, URLPathVersioning
from django.urls import reverse
class TokenView(GenericViewSet):
authentication_classes = []
# permission_classes = [GradeOnePermission]
permission_classes = []
parser_classes = [JSONParser, ]
throttle_classes = []
# versioning_class = QueryParameterVersioning
def get(self, request, *args, **kwargs):
name = request.query_params.get('name')
try:
stu = Student.objects.get(name=name)
except Student.DoesNotExist:
raise ParseError(_('Student does not include this name'))
student = StudentSerializer(instance=stu, many=False)
# print(student)
# print(type(student))
# print(student.data)
# print(type(student.data))
#
# stu_json = json.dumps(student.data, ensure_ascii=False)
version = request.version
print(version)
drf_url = request.versioning_scheme.reverse(viewname='api:version', request=request)
django_url = reverse(viewname='api:version', kwargs=kwargs)
res = {
'code': 200,
'version': version,
'drf_url': drf_url,
'django_url': django_url,
'data': student.data
}
return Response(data=res)
5. postman
(1)
url: http://127.0.0.1:8011/api/v2/token/?token=dbfa6b230b9ca22302a00ea918346f86&name=student1
method: get
return:
{
"code": 200,
"version": "v2",
"drf_url": "http://127.0.0.1:8011/api/v2/token/",
"django_url": "/api/v2/token/",
"data": {
"id": 4,
"name": "student1"
}
}
(2)
method: get
return:
{
"code": 200,
"version": "v3",
"drf_url": "http://127.0.0.1:8011/api/version/?version=v3",
"django_url": "/api/version/",
"data": {
"id": 4,
"name": "student1"
}
}