tengke 发表于 2023-5-21 13:27:53

注册用户时候 密码使用md5加密方式 返回的值还是原来的是数据

from django.conf import settings
import hashlib


def md5(data_string):
    obj = hashlib.md5(settings.SECRET_KEY.encode('utf-8'))
    obj.update(data_string.encode('utf-8'))
    return obj.hexdigest()

class a_user(forms.ModelForm):
    passwords= forms.CharField(
      label="确认密码",
      widget=forms.PasswordInput(render_value=True)
    )
    class Meta:
      model = models.admin
      fields = ["username","password","passwords"]
      widgets = {"password":forms.PasswordInput(render_value=True)}
    def clean(self):
      cleaned_data = super().clean()
      pwd = md5(cleaned_data.get("password"))
      pwds = md5(cleaned_data.get("passwords"))
      print(pwd,pwds)
      if pwds != pwd:
            raise ValidationError("两次密码不一致,请重新输入")
      else:
            print(cleaned_data)
            return cleaned_data

——————————————————————————

如上图所示   pwd   pwds两个字段可以正常转换MD5
return cleaned_data 这个数据还是原来的数据
且 print(md5(cleaned_data))   

    obj.update(data_string.encode('utf-8'))
AttributeError: 'dict' object has no attribute 'encode'有问题




怎么将 return cleaned_data 返回的数据变成md5数据   
print(md5(cleaned_data)) 这个数据如果要这么写怎么写才正确

isdkz 发表于 2023-5-21 13:27:54

在你的代码中, cleaned_data 是一个字典类型的数据,而你的 md5 函数接收的是字符串。这就是为什么你在 md5(cleaned_data) 这段代码时会收到 AttributeError: 'dict' object has no attribute 'encode' 的错误信息,因为你尝试去编码一个字典类型的数据,而不是字符串。

关于如何将 cleaned_data 的返回数据变成md5数据,首先,你需要对字典里的每个值进行单独的md5编码。在此,你需要特别注意的是,你的密码应当在存储到数据库之前就已经被哈希过了。下面是如何修改你的 clean 函数以达到这个目的:

def clean(self):
    cleaned_data = super().clean()
    pwd = md5(cleaned_data.get("password"))
    pwds = md5(cleaned_data.get("passwords"))
    print(pwd, pwds)
    if pwds != pwd:
      raise ValidationError("两次密码不一致,请重新输入")
    else:
      # 更新cleaned_data中的密码为哈希后的密码
      cleaned_data["password"] = pwd
      cleaned_data["passwords"] = pwds
      print(cleaned_data)
      return cleaned_data


此外,需要注意的是,你可能需要在保存你的 admin 模型对象之前更新密码字段,或者在保存模型之前修改密码的保存方式。最理想的方式是在模型层级处理密码的哈希,而不是在表单层级。例如,你可以使用Django的内置的 set_password 方法,它可以自动地将原始密码哈希化。为了安全起见,你可能不希望在任何地方都保留原始的密码。

不过如果你坚持要在表单层级处理密码的哈希,你可以选择在 save 方法中进行处理:

class a_user(forms.ModelForm):
    # 省略其它代码...

    def save(self, commit=True):
      user = super().save(commit=False)
      password = self.cleaned_data.get("password")
      user.set_password(password)# 使用Django内置的set_password方法
      if commit:
            user.save()
      return user


以上代码展示了如何在保存用户时,将密码设置为其哈希值。其中 set_password 方法就是Django提供的一种安全的哈希密码的方式,你可以考虑使用它。
页: [1]
查看完整版本: 注册用户时候 密码使用md5加密方式 返回的值还是原来的是数据