Объект аутентификации DRF JWT не имеет атрибута 'id'

Я использую библиотеку, предложенную DRF (https://github.com/SimpleJWT/django-rest-framework-simplejwt), установленную с использованием

pip install djangorestframework_simplejwt

Добавил в settings.py

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    ]
}

Созданы две конечные точки из импортированных представлений

from rest_framework_simplejwt.views import TokenObtainPairView, TokenRefreshView

urlpatterns = [
    # JWT Token
    path('api/token/', TokenObtainPairView.as_view(), name='token_obtain'),
    # get a new token before the old expires.
    path('api/token/refresh/', TokenRefreshView.as_view, name='token_refresh'),
]

Пользователи без проблем создаются в базе данных, а пароли хешируются.

Если я перейду на http://localhost:8000/api/token/, то получу следующее представление

Отправка правильного пользователя с его паролем, а затем я получаю следующую ошибку

[17/ апр /2020 12:06:51] "POST /api/token/ HTTP/1.1" 500 122221 Внутренняя ошибка сервера: /api/token/ Traceback (последний вызов последний): файл "C:\Users\tiago\Desktop\ playsgo\authenticationJwt\lib\site-packages\django\core\handlers\exception.py", строка 34, во внутреннем файле response = get_response(запрос)"C: \ Users \ tiago \ Desktop \ playsgo\authenticationJwt\lib\site-packages\django\core\handlers\base.py", строка 115, в _get_response response = self.process_exception_by_middleware(e, request) Файл"C: \ Users \ tiago \ Desktop \ playsgo \ authenticationJwt \ lib \ site -packages \ django \ core \ handlers \ base.py ", строка 113, в _get_response response = wrapped_callback(request, *callback_args, **callback_kwargs) Файл"C:\ Users \ tiago \ Desktop \ playsgo\authenticationJwt\lib\site-packages\django\views\decorators\csrf.py", строка 54, в wrapped_view return view_func(*args, **kwargs) File "C:\Users\tiago\Desktop\ playsgo\authenticationJwt\lib\site-packages\django\views\generic\base.py", строка 71, в представлении return self.dispatch(request, *args, **kwargs) File "C:\Users\tiago\Desktop\ playsgo\authenticationJwt\lib\site-packages\rest_framework\views.py", строка 505, в dispatch response = self.handle_exception(exc) File "C:\Users\tiago\Desktop\ playsgo\authenticationJwt\lib\site-packages\rest_framework\views.py", строка 465, в файле handle_exception self.raise_uncaught_exception(exc)"C: \ Users \ tiago \ Desktop \ playsgo\authenticationJwt\lib\site-packages\rest_framework\views.py", строка 476,в raise_uncaught_exception файл с расширением exc "C:\Users\tiago\Desktop\ playsgo \ authenticationJwt \ lib \ site-packages \ rest_framework \ views.py", строка 502, в dispatch response = handler(request, *args, **kwargs) Файл "C:\Users\tiago\Desktop\ playsgo\authenticationJwt\lib\site-packages\rest_framework_simplejwt\views.py", строка 27, в посте serializer.is_valid(raise_exception=True) Файл "C:\Users\tiago\Desktop\ playsgo\authenticationJwt\lib\site-packages\rest_framework\serializers.py", строка 234, в is_valid self._validated_data = self.run_validation(self.initial_data) файле"C: \ Users \ tiago \ Desktop \ playsgo\authenticationJwt\lib\site-packages\rest_framework\serializers.py", строка 436, в run_validation value = self.validate(value) File "C:\Users\tiago\Desktop\ playsgo\authenticationJwt\lib\site-packages\rest_framework_simplejwt\serializers.py", строка 73, в проверке обновления = self.get_token(self.user) Файл"C: \ Users \ tiago \ Desktop \ Let'sgo\authenticationJwt\lib\site-packages\rest_framework_simplejwt\serializers.py", строка 68, в get_token return RefreshToken.for_user(пользователь) Файл"C: \ Users \ tiago \ Desktop \ playsgo\authenticationJwt\lib\site-packages\rest_framework_simplejwt\tokens.py", строка 161, в for_user user_id = getattr(user, api_settings.USER_ID_FIELD) AttributeError: объект 'MyUser' не имеет атрибута 'id'\ Users \ tiago \ Desktop \ playsgo\authenticationJwt\lib\site-packages\rest_framework_simplejwt\serializers.py", строка 68, в get_token return RefreshToken.for_user(пользователь) Файл"C: \ Users \ tiago \ Desktop \ playsgo\authenticationJwt\lib\site-packages\rest_framework_simplejwt\tokens.py", строка 161, в for_user user_id = getattr(user, api_settings.USER_ID_FIELD) AttributeError: объект 'MyUser' не имеет атрибута 'id'\ Users \ tiago \ Desktop \ playsgo\authenticationJwt\lib\site-packages\rest_framework_simplejwt\serializers.py", строка 68, в get_token return RefreshToken.for_user(пользователь) Файл"C: \ Users \ tiago \ Desktop \ playsgo\authenticationJwt\lib\site-packages\rest_framework_simplejwt\tokens.py", строка 161, в for_user user_id = getattr(user, api_settings.USER_ID_FIELD) AttributeError: объект 'MyUser' не имеет атрибута 'id'

Ошибка очевидна, объект MyUser не имеет идентификатора атрибута. Вместо этого онuser_id как primary_key, как вы можете видеть дальше

class MyUser(AbstractBaseUser):
    user_id = models.AutoField(primary_key=True, db_column='userId')
    password = models.CharField(db_column='userPassword', max_length=256)
    email = models.EmailField(verbose_name='email', max_length=100, unique=True)

Дело в том, что я не хочу менять текущие поля MyUser.


РЕДАКТИРОВАТЬ

Зайдя в настройки djangorestframework_simplejwt, можно прочитать

DEFAULTS = {
    ...
    'USER_ID_FIELD': 'id',
    ...
}

Итак, учитывая, что я не хочу менять MyUser primary_key на id, я пошел в место, где был установлен djangorestframework_simplejwt, и выполнял поиск, где объявляется USER_ID_FIELD.

Нашел только в venv\Jwt\Lib\site-packages\djangorestframework_simplejwt-4.4.0.dist-info\METADATA, в SIMPLE_JWT. Там изменилось на

  SIMPLE_JWT = {
      ...
      'USER_ID_FIELD': 'user_id',
      ...
  }

Затем перезапустили venv и runserver. Проблема все еще возникает.

1 ответ

Решение

Я сбросил изменения, сделанные в МЕТАДАННЫХ, затем перешел в файл settings.py моего проекта и добавил

SIMPLE_JWT = {
    'USER_ID_FIELD': 'user_id'
}
Другие вопросы по тегам