from django.shortcuts import get_object_or_404 from django.utils.decorators import method_decorator from django.contrib.auth.decorators import login_required from django.contrib.auth import logout from rest_framework import parsers, renderers, status from rest_framework.authtoken.models import Token from rest_framework.authtoken.serializers import AuthTokenSerializer from rest_framework.compat import coreapi, coreschema from rest_framework.response import Response from rest_framework.schemas import ManualSchema from rest_framework.schemas import coreapi as coreapi_schema from rest_framework.views import APIView class ObtainAuthToken(APIView): throttle_classes = () permission_classes = () parser_classes = (parsers.FormParser, parsers.MultiPartParser, parsers.JSONParser,) renderer_classes = (renderers.JSONRenderer,) serializer_class = AuthTokenSerializer if coreapi_schema.is_enabled(): schema = ManualSchema( fields=[ coreapi.Field( name="username", required=True, location='form', schema=coreschema.String( title="Username", description="Valid username for authentication", ), ), coreapi.Field( name="password", required=True, location='form', schema=coreschema.String( title="Password", description="Valid password for authentication", ), ), ], encoding="application/json", ) def get_serializer_context(self): return { 'request': self.request, 'format': self.format_kwarg, 'view': self } def get_serializer(self, *args, **kwargs): kwargs['context'] = self.get_serializer_context() return self.serializer_class(*args, **kwargs) def post(self, request, *args, **kwargs): serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) user = serializer.validated_data['user'] token, created = Token.objects.get_or_create(user=user) return Response({'token': token.key}) @method_decorator(login_required) def delete(self, request, *args, **kwargs): """Delete the token and logout.""" token = get_object_or_404(Token, user=request.user) token.delete() logout(request) return Response({'detail': "You've been logged out!"}, status=status.HTTP_205_RESET_CONTENT) obtain_auth_token = ObtainAuthToken.as_view()