DRF JWT объект аутентификации не имеет атрибута "id" - PullRequest
0 голосов
/ 17 апреля 2020

Я использую библиотеку , предложенную DRF ( djangorestframework_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'),
]

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

Если i go to http://localhost: 8000 / api / token / , затем получите следующий вид

Token Obtain Pair JWT DRF

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

AttributeError at /api/token/

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

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

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 Ответ

0 голосов
/ 17 апреля 2020

Я сбросил изменения, сделанные в METADATA, затем перешел в мой файл settings.py проекта и добавил

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