1. api/authenticate.py
# -*- coding: utf8 -*-
from rest_framework.authentication import BaseAuthentication
from rest_framework.exceptions import AuthenticationFailed, ParseError
from django.utils.translation import ugettext as _
from .models import Student, Token
class StudentAuthenticate(BaseAuthentication):
def authenticate(self, request):
token = request._request.GET.get('token')
try:
token_obj = Token.objects.get(token=token)
except Token.DoesNotExist:
# raise ParseError(_('token error'))
raise AuthenticationFailed(_('authenticate failed'))
return token_obj.student, token_obj
2. api/views.py
from api.authenticate import StudentAuthenticate
class TokenView(GenericViewSet):
# authentication_classes = []
permission_classes = []
parser_classes = [JSONParser, ]
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'))
token = stu.token.token
res = dict()
res['code'] = 200
res['name'] = name
res['token'] = token
logger.info(pformat(res))
return Response(data=res, status=status.HTTP_200_OK)
3. api/urls.py
# -*- coding: utf8 -*-
from django.conf.urls import url
from .views import AuthView, TokenView
urlpatterns = [
url(r'auth/', AuthView.as_view()),
url(r'token/', TokenView.as_view({'get': 'get'})),
]
6. settings.py
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': ['api.authenticate.StudentAuthenticate'],
}
5. postman
(1)
url: http://127.0.0.1:8011/api/v1/token/?name=student1&token=dbfa6b230b9ca22302a00ea918346f86
method: get
return:
{
"code": 200,
"name": "student1",
"token": "dbfa6b230b9ca22302a00ea918346f86"
}
(2)
url: http://127.0.0.1:8011/api/v1/token/?name=student1
method: get
return:
{
"detail": "authenticate failed"
}