идентификатор пользователя = getattr(пользователь, api_settings.ПОЛЕ ИДЕНТИФИКАТОРА ПОЛЬЗОВАТЕЛЯ) Ошибка атрибута: объект ‘str’ не имеет идентификатора атрибута

#python #django #django-rest-framework #django-rest-framework-simplejwt

Вопрос:

Я пытаюсь аутентифицировать пользователя по электронной почте с помощью DRF, но до сих пор я получал только ошибки. Это класс, который обрабатывает проверку электронной почты

 class VerifyEmail(GenericAPIView):
    def get(self, request):
        token = request.GET.get('token')  
        try:
            payload = jwt.decode(token, settings.SECRET_KEY) # Decodes the user token and the secret key to get the user ID
            print(payload) 
            user = User.objects.get(id=payload['user_id']) # Gotten the user ID 
            if not user.is_verified:  # Runs an if statement to see if the user has been verified already
                user.is_verified = True
                user.save()
            data = {"confirmation_message": "Your account has been verified"}
            return Response(data, status=status.HTTP_200_OK)
        except jwt.ExpiredSignatureError as identifier:
            error = {"expired_activation_link": "The activation link has expired"}
            return Response(error, status=status.HTTP_400_BAD_REQUEST)
        except jwt.DecodeError as identifier:
            error = {"invalid_token": "The token is invalid request a new one"}
            return Response(error, status=status.HTTP_400_BAD_REQUEST)

 

и это ошибка, которую я продолжаю получать

 Internal Server Error: /auth/register                                            
Traceback (most recent call last):                                               
  File "/mnt/c/Users/Somtochukwu/Desktop/cultural-exchange/proj/lib/python3.8/site-packages/django/core/handlers/exception.py", line 47, in inner                 
    response = get_response(request)                                             
  File "/mnt/c/Users/Somtochukwu/Desktop/cultural-exchange/proj/lib/python3.8/site-packages/django/core/handlers/base.py", line 181, in _get_response             
    response = wrapped_callback(request, *callback_args, **callback_kwargs)      
  File "/mnt/c/Users/Somtochukwu/Desktop/cultural-exchange/proj/lib/python3.8/site-packages/django/views/decorators/csrf.py", line 54, in wrapped_view            
    return view_func(*args, **kwargs)                                            
  File "/mnt/c/Users/Somtochukwu/Desktop/cultural-exchange/proj/lib/python3.8/site-packages/django/views/generic/base.py", line 70, in view                       
    return self.dispatch(request, *args, **kwargs)                               
  File "/mnt/c/Users/Somtochukwu/Desktop/cultural-exchange/proj/lib/python3.8/site-packages/rest_framework/views.py", line 509, in dispatch                       
    response = self.handle_exception(exc)                                        
  File "/mnt/c/Users/Somtochukwu/Desktop/cultural-exchange/proj/lib/python3.8/site-packages/rest_framework/views.py", line 469, in handle_exception               
    self.raise_uncaught_exception(exc)                                           
  File "/mnt/c/Users/Somtochukwu/Desktop/cultural-exchange/proj/lib/python3.8/site-packages/rest_framework/views.py", line 480, in raise_uncaught_exception       
    raise exc                                                                    
  File "/mnt/c/Users/Somtochukwu/Desktop/cultural-exchange/proj/lib/python3.8/site-packages/rest_framework/views.py", line 506, in dispatch                       
    response = handler(request, *args, **kwargs)                                 
  File "/mnt/c/Users/Somtochukwu/Desktop/cultural-exchange/SRC/users/views.py", l
ine 43, in post                                                                  
    token = RefreshToken.for_user(user_email).access_token                       
  File "/mnt/c/Users/Somtochukwu/Desktop/cultural-exchange/proj/lib/python3.8/sit
e-packages/rest_framework_simplejwt/tokens.py", line 161, in for_user            
    user_id = getattr(user, api_settings.USER_ID_FIELD)                          
AttributeError: 'str' object has no attribute 'id'     
 

пожалуйста, как я могу это исправить?

Комментарии:

1. Вы получаете ошибку в какой-либо функции / методе post , в строке 43 вашего кода, которая является token = RefreshToken.for_user(user_email).access_token . Покажите эту функцию.

Ответ №1:

В вашей views.py строке 43,

token = RefreshToken.for_user(user_email).access_token

Это неправильно, потому RefreshToken.for_user() что метод принимает User объект в качестве аргумента, а не строку, и именно поэтому вы получаете эту ошибку.