DRF SimpleJWT 删除密码并添加日期字段

Posted

技术标签:

【中文标题】DRF SimpleJWT 删除密码并添加日期字段【英文标题】:DRF SimpleJWT remove password and add date field 【发布时间】:2020-09-15 20:50:58 【问题描述】:

我创建了一个从 AbstractBaseUser 扩展的自定义用户模型,其中我从用户那里获得的唯一数据是用户 ID、用户(用户名字段)和日期(必需,格式为 dd-mm-yyyy) 并且用户的创建工作正常,您可以从下一张图片中的数据库中看到

使用password = Nonelast_login = None 表示我不想要密码和last_login 表。

然后,创建了一个只有经过身份验证的用户才能访问的视图。

为了处理身份验证,使用了simpleJWT。在 urls.py 中

# 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://127.0.0.1:8000/api/token/ ,这就是我所看到的(按预期工作)

我之前在另一个项目中使用包含该数据(用户和密码)的用户模型测试了用户和密码,并且工作正常。现在,在这里,如果我尝试使用现有用户发布但没有密码,我会收到警告并且无法发布

此字段不能为空。

如果我添加除空格以外的任何内容,则会出现以下错误

/api/token/ 处的类型错误 “NoneType”类型的对象没有 len()

如何删除密码字段?另外,我怎样才能添加一个日期字段呢?

【问题讨论】:

在没有密码的情况下获取用户令牌有什么意义? @ArakkalAbu 这是针对特定场景的,这是需要的。 知道您的要求,但是,如果我知道您的 "用户名" 怎么办? 我知道@ArakkalAbu 【参考方案1】:

我也遇到了同样的问题,我设法解决了这个问题。

这是解决方案,

    重写TokenObtainPairSerializer__init__ 方法,如下所示,

    使用del password,这样它就不会询问您密码并添加您想要的任何字段。

class CustomSerializer(TokenObtainPairSerializer): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.fields[self.username_field] = serializers.CharField() del self.fields['password'] self.fields['last_login'] = serializers.DateField(initial=datetime.date.today)

这真的很好用。

这是参考 - How to skip or remove password field in simplejwt token authentication in django rest framework??

如果有人对此有更好的解决方案,请告诉我。

【讨论】:

以上是关于DRF SimpleJWT 删除密码并添加日期字段的主要内容,如果未能解决你的问题,请参考以下文章

DRF 简单 jwt 从用户实例获取身份验证令牌或更改用户名和密码组合

djangorestframework-simplejwt

django drf JWT

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

Django DRF websocket 通道 2 并使用来自 Simple JWT 的令牌进行授权

在 DRF 中使用与 models.DateTimeField 相同的日期/时间格式