Как мне построить сериализатор логинов и View, который использует DRF для аутентификации токенов?

Вот как выглядит мой сериализатор подписей

class AuthUserSerializer(serializers.ModelSerializer):
    class Meta:
        model = AuthUser
        fields = ('first_name', 'last_name', 'email', 'password', 'role')
    
    def create(self, data):
        return AuthUser.objects.create(**data)

Вот его вид:

class Signup(CreateAPIView):
    serializer_class = AuthUserSerializer
    queryset = AuthUser.objects.all()

    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        user = serializer.save()
        headers = self.get_success_headers(serializer.data)
        token, created = Token.objects.get_or_create(user=serializer.instance)
        return Response({'token': token.key}, status=status.HTTP_201_CREATED, headers=headers)

И данные вставляются в DATA успешно, и токен генерируется правильно. Теперь я хочу сделать конечную точку входа в систему, где пользователь будет вводить свой email и пароль и, если это так, возвращать токен. Пожалуйста, помогите мне, как я должен построить этот сериализатор входа & view.

Вы уверены, что вам нужно это делать? DRF предоставляет полную модель аутентификации, и вам не нужно создавать ее самостоятельно. Если вы хотите настроить ее под себя, используйте наследование.

в settings.py определите классы auth (в вашем случае используйте TokenAuthentication)

...
INSTALLED_APPS = [
    ...
    'rest_framework.authtoken'
]

в urls.py добавьте auth url:

from rest_framework.authtoken import views
urlpatterns += [
    path('api-token-auth/', views.obtain_auth_token)
]

Если вы хотите настроить аутентификацию, наследуйте от DRF ObtainTokenAuth:

from rest_framework.authtoken.views import ObtainAuthToken
from rest_framework.authtoken.models import Token
from rest_framework.response import Response

class CustomAuthToken(ObtainAuthToken):

    def post(self, request, *args, **kwargs):
        serializer = self.serializer_class(data=request.data,
                                           context={'request': request})
        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,
            'user_id': user.pk,
            'email': user.email
        })

и затем измените ваш urls.py

urlpatterns += [
    path('api-token-auth/', CustomAuthToken.as_view())
]

Подробнее читайте в документации DRF: https://www.django-rest-framework.org/api-guide/authentication/

Вернуться на верх