Объект аутентификации 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'
}