Как мне построить сериализатор логинов и 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/