簡體   English   中英

DRF JWT 身份驗證 object 沒有屬性“id”

[英]DRF JWT Authentication object has no attribute 'id'

我正在使用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 到http://localhost:8000/api/token/ ,則得到如下視圖

Token 獲取 Pair JWT DRF

使用密碼發布正確的用戶,然后我收到以下錯誤

/api/token/ 處的 AttributeError

[2020 年 4 月 17 日 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, *a rgs, **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 raise exc 文件 "C:\Users\tiago\Desktop\letsgo\authenticationJwt\lib\site-packages\rest_framework\views.py",行502,在 dispatch response = handler(request, *args, **kwargs) File "C:\Users\tiago\Desktop\letsgo\authenticationJwt\lib\site-packages\rest_framework_simplejwt\views.py",第 27 行,在帖子中serializer.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 值 = 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' object 沒有屬性 'id'

錯誤很明顯,MyUser object 沒有屬性 id。 相反,它具有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 的地方。

僅在 SIMPLE_JWT 的 venv\Jwt\Lib\site-packages\djangorestframework_simplejwt-4.4.0.dist-info\METADATA 中找到它。 在那里,改為

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

然后,重新啟動 venv 和 runserver。 問題仍然存在。

我已重置 METADATA 中所做的更改,然后轉到我的項目 settings.py 文件並添加

SIMPLE_JWT = {
    'USER_ID_FIELD': 'user_id'
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM