Django - Получение информации о пользователе с помощью JWT-токена

МОЯ ФУНКЦИЯ ПОКАЗЫВАЕТ ТОКЕН API только когда я перехожу по ссылке (user-info)API/login. Я хочу показать токены API с информацией о пользователе. http://127.0.0.1:8000/api/login/ ссылка показывает API с информацией о пользователе

# Import libraries
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
from rest_framework_simplejwt.views import TokenObtainPairView
from base.api.serializers import UserSerializer
from base.models import User
from rest_framework.permissions import IsAuthenticated, AllowAny
 
class MyTokenObtainPairSerializer(TokenObtainPairSerializer):
@classmethod
def get_token(cls, user):
    token = super().get_token(user)

    # Add custom claims
    token['username'] = user.username

    return token

# Token Access
class MyTokenObtainPairView(TokenObtainPairView):
    serializer_class = MyTokenObtainPairSerializer

# Registration 
class RegisterView(APIView):
    permission_classes = [AllowAny]

    def post(self, request):
        serializer = UserSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        serializer.save()
        return Response(serializer.data)

# User information
class LoginView(APIView):
    permission_classes = [IsAuthenticated]

    def get(self, request):
        user_id = request.user.id
        user = User.objects.get(id=user_id)
        serializer = UserSerializer(user)
        return Response(serializer.data)

API Token Access

В этом случае вам необходимо изменить MyTokenObtainPairSerializer. Сначала создайте новый User Serializer, который будет содержать информацию о пользователе.

Нравится :

from rest_framework_simplejwt.tokens import RefreshToken

class UserSerializerWithToken(UserSerializer):
    token = serializers.SerializerMethodField(read_only=True)

    class Meta:
        model = CustomUser
        fields = ['username',
                  'isAdmin',
                  # ...
                  'token']

    def get_token(self, obj):
        token = RefreshToken.for_user(obj)
        return str(token.access_token)

Затем измените Вид

class MyTokenObtainPairSerializer(TokenObtainPairSerializer):
    def validate(self, attrs):
        data = super().validate(attrs)

        serializer = UserSerializerWithToken(self.user).data 
        for k, v in serializer.items():
            data[k] = v

        return data

Теперь сделайте еще один для входа в систему.

class MyTokenObtainPairView(TokenObtainPairView):
    serializer_class = MyTokenObtainPairSerializer

URL для входа в систему :

path('login/', views.MyTokenObtainPairView.as_view(),
Вернуться на верх