Этот login_required
не является rest_framework
способом аутентификации. Вам нужно использовать класс разрешений для аутентификации через ваш API, если это то, что вы пытаетесь сделать.
Как я это реализовал, я создал представление для входа в систему
class LoginView(APIView):
"""Class based view loggin in user and returning Auth Token."""
authentication_classes = [TokenAuthentication]
permission_classes = [AllowAny]
def post(self, request):
"""Check if user exists, return token if it does."""
data = JSONParser().parse(request)
serializer_obj = LoginObjectSerializer(data=data)
if serializer_obj.is_valid():
user = authenticate(username=serializer_obj.data['username'], password=serializer_obj.data['password'])
if not user:
return Response({'error': 'Invalid Credentials'}, status=404)
token, _ = Token.objects.get_or_create(user=user)
return Response({'token': token.key}, status=200)
return JsonResponse(serializer_obj.errors, status=400)
И как я аутентифицировал свои APIбыло с использованием rest-framework
предоставленных классов разрешений вместо @login_required
. Мой settings.py
имеет
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.TokenAuthentication',
),
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated', )
}
, и класс разрешений, который я использовал для защиты своих представлений, был таким:
from rest_framework.permissions import AllowAny, IsAuthenticated
authentication_classes = [TokenAuthentication]
permission_classes = [IsAuthenticated]
Но я использовал это в представлениях на основе классов. Для метода, основанного на методе, вы можете сделать это, как указано здесь
@permission_classes([IsAuthenticated])
Суть в том, что вы пытаетесь использовать аутентификацию на основе токена, но на самом деле вы ее не используете. Создайте свой собственный API для входа в систему и используйте его, как указано в этом ответе или ответе @ sebastienbarbier.