【问题标题】:Python : name 'set_password' is not definedPython:未定义名称“set_password”
【发布时间】:2021-03-18 13:54:26
【问题描述】:

我试图在添加到数据库之前注册用户散列密码,如下所示

settings.py

PASSWORD_HASHERS = (
    'django.contrib.auth.hashers.MD5PasswordHasher',
)

Models.py

from django.contrib.auth.models import AbstractBaseUser

class Users(AbstractBaseUser):
    name = models.CharField(max_length=200)
    email =  models.CharField(max_length=200)
    password =  models.CharField(max_length=255)

Views.py

name = form.cleaned_data.get('name')
email = form.cleaned_data.get('email')
password = form.cleaned_data.get('password')
date_joined = date.today()

if Users.objects.filter(email=email).exists() and Users.objects.filter(name=name).exists() :
    messages.info(request, 'User already exists')
else:
    Users.objects.create(name=name, email=email, password=set_password(password), date_joined=date_joined)

但是当我真正尝试创建用户时,我得到Python : name 'set_password' is not defined 怎么了?我需要在Views.py 导入一些东西吗?

【问题讨论】:

    标签: python django encryption hash


    【解决方案1】:

    您必须在用户实例上使用set_password(),而不是在创建用户时。

    试试这个:

    user = Users.objects.create(name=name, email=email, date_joined=date_joined)
    user.set_password(password)
    user.save()
    

    我可以看到您正在扩展用户模型。我会看一些文章来了解如何做到这一点,我推荐这个article

    【讨论】:

    • 完美。非常感谢!在登录状态我是否重复相同的过程?
    • 这是一个不同的过程,您可以使用表单中的密码。在这里查看文档:docs.djangoproject.com/en/3.1/topics/auth/default/…
    • 我认为authenticate() 检查未散列的密码。这在我的情况下不起作用
    • authenticate() 不检查未散列的密码。自从您设置了'django.contrib.auth.hashers.MD5PasswordHasher'以来,密码永远不会以未散列的形式存储在数据库中。它将从表单中对密码进行哈希处理,并检查哈希表单密码是否与数据库中的哈希密码匹配。这样,数据库中的密码永远不会“未散列”。
    猜你喜欢
    • 2021-10-18
    • 2016-05-16
    • 2013-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-01
    • 2014-03-23
    相关资源
    最近更新 更多