DRF JWT 身份验证对象没有属性“id”

Tia*_*ica 3 python django jwt django-rest-framework django-rest-framework-simplejwt

我正在使用DRF ( djangorestframework_simplejwt ) 建议的库,使用安装

pip install djangorestframework_simplejwt
Run Code Online (Sandbox Code Playgroud)

将其添加到settings.py

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    ]
}
Run Code Online (Sandbox Code Playgroud)

从导入的视图创建两个端点

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'),
]
Run Code Online (Sandbox Code Playgroud)

在数据库中创建用户没有任何问题,并且密码正在被散列。

如果我访问http://localhost:8000/api/token/,然后得到以下视图

令牌获取对 JWT DRF

发布正确的用户及其密码,然后出现以下错误

/api/token/ 处的属性错误

[17/4/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(request) 文件“C:\Users\tiago\Desktop\letsgo\authenticationJwt\ lib\site-packages\django\core\handlers\base.py”,第 115 行,在 _get_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 响应 =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_func(*args, **kwargs) 文件“C:\Users\tiago\Desktop\letsgo\authenticationJwt\lib\site-packages\ django\views\generic\base.py”,第 71 行,视图返回 self.dispatch(request, *args, **kwargs) 文件“C:\Users\tiago\Desktop\letsgo\authenticationJwt\lib\site-packages \rest_framework\views.py”,第 505 行,调度响应 = self.handle_exception(exc) 文件“C:\Users\tiago\Desktop\letsgo\authenticationJwt\lib\site-packages\rest_framework\views.py”,行465,在handle_exception self.raise_uncaught_exception(exc)文件“C:\Users\tiago\Desktop\letsgo\authenticationJwt\lib\site-packages\rest_framework\views.py”中,第476行,在raise_uncaught_exception中引发exc文件“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 行,在序列化程序后。is_valid(raise_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 value = self.validate(value) 文件“C:\Users\tiago\Desktop\letsgo\authenticationJwt\lib\site-packages\rest_framework_simplejwt\serializers.py”,第 73 行,在验证刷新 = self.get_token(self.user) 文件“C:\Users\tiago\Desktop\letsgo\authenticationJwt\lib\site-packages\rest_framework_simplejwt\serializers.py”,第 68 行,在 get_token 中返回 RefreshToken.for_user(user )文件“C:\Users\tiago\Desktop\letsgo\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 对象没有属性 id。相反,它具有user_idPrimary_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)
Run Code Online (Sandbox Code Playgroud)

问题是,我不想更改当前的 MyUser 字段。


编辑

转到djangorestframework_simplejwt 的设置,可以读取

DEFAULTS = {
    ...
    'USER_ID_FIELD': 'id',
    ...
}
Run Code Online (Sandbox Code Playgroud)

因此,考虑到我不想将 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',
      ...
  }
Run Code Online (Sandbox Code Playgroud)

然后,重新启动 venv 和 runserver。问题仍然发生。

Tia*_*ica 5

我已经重置了 METADATA 中所做的更改,然后转到我的项目 settings.py 文件并添加

SIMPLE_JWT = {
    'USER_ID_FIELD': 'user_id'
}
Run Code Online (Sandbox Code Playgroud)