Как правильно перехватить POST-запрос в представлении Django при использовании аутентификации с помощью JSON Web-токена?

Я настроил переменную AUTH_USER_MODEL в settings.py для реализации аутентификации JSON Web Token в Django, и все прекрасно работает для входа в систему как суперпользователь в разделе администратора.

Для перехода от аутентификации на основе сеансов к аутентификации на основе токенов я следовал руководству ( здесь), в котором говорится, что request.user специфичен для аутентификации на основе сеансов. Но я не понимаю, что после перехода на аутентификацию на основе токенов они по-прежнему смотрят на ключ user в POST запросе, в строке request.data.get('user', {}), и по какой причине они говорят, что он отсутствует

Есть ли проблема с учебником или я что-то упускаю? Потому что для получения корректных данных мне нужно преобразовать тип запроса из QueryDict в Dict и затем раскрыть список значений словаря.

Содержание request.data:

<QueryDict: {'csrfmiddlewaretoken': ['a25DVh7Ha2qpkiokNLapzDjZuq1avggdjjfXoboXaeRbcJ7AkqsCnbMNUOq'], 'email': ['dd@dd.com'], 'username': ['Bob'], 'password': ['12345']}>

views.py

from rest_framework import status
from rest_framework.permissions import AllowAny
from rest_framework.response import Response
from rest_framework.views import APIView

from authentication.serializers import RegistrationSerializer


class RegistrationAPIView(APIView):

    permission_classes = (AllowAny,)
    serializer_class = RegistrationSerializer

    def post(self, request):
        
        # user = request.data.get('user', {})  # <- returns {}
        user = dict(request.data)
        user = {k:v[0] for k,v in user.items()}

        serializer = self.serializer_class(data=user)
        serializer.is_valid(raise_exception=True)
        serializer.save()

        return Response(serializer.data, status=status.HTTP_201_CREATED)

serializer.py

from rest_framework import serializers
from authentication.models import User


class RegistrationSerializer(serializers.ModelSerializer):
    print('Run serializer')

    password = serializers.CharField(
        max_length=128,
        min_length=8,
        write_only=True,
        required=False
    )

    token = serializers.CharField(max_length=255, read_only=True)

    class Meta:
        model = User
        fields = ['email', 'username', 'password', 'token']

    def create(self, validated_data):
        return User.objects.create_user(**validated_data)

settings.py

AUTH_USER_MODEL = 'authentication.User'

AUTHENTICATION_BACKENDS = [
    'graphql_jwt.backends.JSONWebTokenBackend',
    'django.contrib.auth.backends.ModelBackend',
]

GRAPHQL_JWT = {
    "JWT_ALLOW_ARGUMENT": True,
}

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'authentication.backends.JWTAuthentication',
    ]
}
Вернуться на верх