#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
объект в качестве аргумента, а не строку, и именно поэтому вы получаете эту ошибку.
- Ссылка на
for_user
документы.. - Вы также можете увидеть код соответствующего
RefreshToken.for_user
метода на их github здесь.