Как правильно перехватить 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',
]
}