Задать вопрос
@Kamral
ПРОГРАММИСТ

Как исправить ошибку return [auth() for auth in self.authentication_classes] TypeError: 'type' object is not iterable?

Пытаюсь получить пользователя по токену
#serializers.py
from rest_framework import serializers
from  profiles.models import UserProfile
from user.models import User
from django.contrib.auth import authenticate
from django.contrib.auth.models import update_last_login
from rest_framework import serializers
from rest_framework_jwt.settings import api_settings
from user.models import User

JWT_PAYLOAD_HANDLER=api_settings.JWT_PAYLOAD_HANDLER
JWT_ENCODE_HANDLER=api_settings.JWT_ENCODE_HANDLER

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model=UserProfile
        fields=('first_name','last_name','phone_number','age','gender')

class UserRegistrationSerializer(serializers.ModelSerializer):
    profile=UserSerializer(required=True)

    class Meta:
        model=User
        fields=('email','password','profile')
        extra_kwargs={'password':{'write_only':True}}

    def create(self, validated_data):
        profile_data=validated_data.pop('profile')
        user=User.objects.create_user(**validated_data)
        UserProfile.objects.create(
            user=user,
            first_name=profile_data['first_name'],
            last_name=profile_data['last_name'],
            phone_number=profile_data['phone_number'],
            age=profile_data['age'],
            gender=profile_data['gender']
        )
        return user

class UserLoginSerializer(serializers.ModelSerializer):
    email=serializers.CharField(max_length=255)
    password=serializers.CharField(max_length=255, write_only=True)
    token=serializers.CharField(max_length=255, read_only=True)
    def validate(self, data):
        email=data.get("email",None)
        password=data.get("password",None)
        user=authenticate(email=email,password=password)
        if user is None:
            raise serializers.ValidationError(
                'Если пользовательне нашел email и password'
            )
        try:
            payload=JWT_PAYLOAD_HANDLER(user)
            jwt_token=JWT_ENCODE_HANDLER(payload)
            update_last_login(None,user)
        except User.DoesNotExist:
            raise  serializers.ValidationError(
                'Пользователь отправляет почту и пароль . Он не должен быть пустым'
            )
        return {
            'email':user.email,
            'token':jwt_token
        }

#views.py
from django.shortcuts import render

# Create your views here.
# выдает статус кода()

from rest_framework import status
# создание аpi
from rest_framework.generics import CreateAPIView
# отправляет ответ
from rest_framework.response import Response
# разрешение всем
from rest_framework.permissions import AllowAny
from .serializers import \
    UserRegistrationSerializer,\
    UserLoginSerializer
from profiles.models import UserProfile

from rest_framework.generics import RetrieveAPIView

from rest_framework.permissions import IsAuthenticated
from rest_framework_jwt.authentication import JSONWebTokenAuthentication


# создание представления путем расширения CreateAPIView.
class UserRegistrationView(CreateAPIView):
    # Serializer_class сообщает, какой сериализатор использовать,
    serializer_class = UserRegistrationSerializer
    # а permission_classes определяет, кто может получить доступ к API.
    permission_classes = (AllowAny,)

    def post(self, request):
        serializer = self.serializer_class(data=request.data)
        serializer.is_valid(raise_exception=True)
        serializer.save()
        status_code = status.HTTP_201_CREATED
        response = {
            'success': 'True',
            'status code': status_code,
            'message': 'User registered  successfully',
        }
        return Response(response, status=status_code)

class UserLoginView(RetrieveAPIView):
    permission_classes = (AllowAny,)
    serializer_class = UserLoginSerializer

    def post(self,request):
        serializer=self.serializer_class(data=request.data)
        serializer.is_valid(raise_exception=True)
        response={
            'success':'True',
            'status_code':status.HTTP_200_OK,
            'message':'Ваш логин успешно зарегистрирован',
            'token':serializer.data['token']
        }
        status_code=status.HTTP_200_OK
        return Response(response, status=status_code)

class UserProfileView(RetrieveAPIView):
    permission_classes = (IsAuthenticated,)
    authentication_classes = JSONWebTokenAuthentication
    def get(self, request):
        try:
            user_profile=UserProfile.objects.get(user=request.user)
            status_code=status.HTTP_200_OK
            response={
                'success':'true',
                'status code':status_code,
                'message':'User profile fetched successfully',
                'data':[
                    {
                        'first_name':user_profile.first_name,
                        'last_name':user_profile.last_name,
                        'phone_number':user_profile.phone_number,
                        'age':user_profile.phone_number,
                        'gender':user_profile.gender,
                    }
                ]
            }
        except Exception as e:
            status_code=status.HTTP_400_BAD_REQUEST
            response={
                'success':'false',
                'status code':status.HTTP_400_BAD_REQUEST,
                'message':'User does  not exists',
                'error':str(e)
            }
        return Response(response, status=status_code)


#settings

AUTH_USER_MODEL='user.User'
# Password validation
# https://docs.djangoproject.com/en/2.2/ref/settings/#auth-password-validators

REST_FRAMEWORK={
# разрешение на уровне проекта
    'DEFAULT_PERMISSION_CLASSES':(
# разрешение для авторизованных
        'rest_framework.permissions.IsAuthenticated',
# разрешение для админа
        'rest_framework.permissions.IsAdminUser',
    ),
    'DEFAULT_AUTHENTICATION_CLASSES':(
# для выдачи json web token
        'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
    ),
}

# для определения настройки JWT
# JSONWebTokenAuthentication
JWT_AUTH={
# JWT_ENCODE_HANDLER: полезная нагрузка, которую мы хотим кодировать.

    'JWT_ENCODE_HANDLER':
    'rest_framework_jwt.utils.jwt_encode_handler',

    'JWT_DECODE_HANDLER':
    'rest_framework_jwt.utils.jwt_decode_handler',

# JWT_PAYLOAD_HANDLER: данные, которые мы хотим передать как полезную нагрузку.
    'JWT_PAYLOAD_HANDLER':
    'rest_framework_jwt.utils.jwt_payload_handler',

    'JWT_PAYLOAD_GET_USER_ID_HANDLER':
    'rest_framework_jwt.utils_get_user_id_from_payload_handler',

# JWT_SECRET_KEY: секретный ключ для кодирования / декодирования токена
    'JWT_SECRET_KEY':'SECRET_KEY',
    'JWT_GET_USER_KEY':None,
    'JWT_PUBLIC_KEY':None,
    'JWT_PRIVATE_KEY':None,

# JWT_ALGORITHM: какой алгоритм использовать
    'JWT_ALGORITM':'HS256',

# JWT_VERIFY: если мы хотим проверить токен, всегда должно быть True
    'JWT_VERIFY':True,

# JWT_VERIFY_EXPIRATION: если срок действия токена истек.
    'JWT_VERIFY_EXPIRATION':True,
    'JWT_AUDIENCE':True,
    'JWT_ISSUER':None,
    'JWT_ALLOW_REFRESH':False,
# JWT_EXPIRATION_DELTA: время истечения срока действия токена, можно в минутах, часах, днях
    'JWT_REFRESH_EXPIRATION_DELTA':timedelta(days=30),
# JWT_AUTH_HEADER_PREFIX: префикс, который будет использоваться с токеном,
    # как правило, мы предпочитаем Bearer
    'JWT_AUTH_HEADER_PREFIX':'Bearer',
    'JWT_AUTH_COOKIE':None
}
  • Вопрос задан
  • 509 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
kgb_zor
@kgb_zor
I need your traceback.
Вы пытаетесь итерировать ОБЪЕКТ, замените ваш authentication_classes на этот -
authentication_classes = (JSONWebTokenAuthentication, )


И оформляйте код по-человечески, если хотите, чтоб вам помогали.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@gromyko21
Вставьте код правильно, невозможно читать без отступов... А вообще ваша ошибка говорит о том, что authentication_classes объект нельзя итерировать то есть он не является списком или кортежем. А так перед итерацией попробуйте сделать print(self.authentication_classes) и посмотреть, что он вообще выводит.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы