修改django-rest-passwordreset确认视图 密码重置后更新用户字段
django-rest-passwordreset 密码重置成功后更新自定义字段实现方案
不需要重写库自带的confirm视图,直接使用库官方预留的信号钩子实现即可,该方案耦合度最低,不会影响后续库版本升级,是最稳妥的实现方式。
实现步骤
- 首先确认你的自定义用户模型已正确添加
changed_password字段,参考定义如下:
# users/models.py from django.contrib.auth.models import AbstractUser from django.db import models class CustomUser(AbstractUser): changed_password = models.BooleanField(default=False, verbose_name="密码修改状态")
- 编写信号接收函数,绑定密码重置成功的触发事件:
django-rest-passwordreset内置了password_reset_confirmed信号,会在重置token校验通过、新密码成功写入用户实例后触发,你只需要在信号回调里更新目标字段即可。在你的用户模块下新建signals.py写入以下代码:
# users/signals.py from django.dispatch import receiver from django_rest_passwordreset.signals import password_reset_confirmed @receiver(password_reset_confirmed) def mark_password_changed(sender, user, *args, **kwargs): user.changed_password = True # 指定update_fields只更新目标字段,避免触发全量save的额外逻辑 user.save(update_fields=["changed_password"])
- 注册信号,保证Django启动时能正常加载回调逻辑:
很多人写了信号不生效都是因为没做注册,需要修改对应app的apps.py配置,添加ready方法导入信号模块:
# users/apps.py from django.apps import AppConfig class UsersConfig(AppConfig): default_auto_field = "django.db.models.BigAutoField" name = "users" # 替换为你自己的app名称 def ready(self): import users.signals # 替换为你自己的signals模块路径
可选方案:重写confirm视图
如果你本身就有定制confirm接口逻辑的需求(比如修改返回值、增加额外校验),也可以直接继承库原有的ResetPasswordConfirm视图,在密码保存成功的逻辑分支里同步更新changed_password字段即可,但这种方式需要自己维护视图逻辑,后续库更新安全补丁时需要手动同步代码,优先级低于信号方案。
验证方式
走一遍完整密码重置流程:申请重置token -> 携带合法token提交新密码 -> 查询对应用户实例,changed_password字段会自动更新为True。
内容的提问来源于stack exchange,提问作者Diana
相关产品推荐
相关产品推荐

