我尝试通过两种不同的方式在django中创建User
s(django.contrib.auth.models.User
):
User.objects.create(username="<username_here>", password="<password_here>", email="<email_here>)
- &gt;当我使用它时,登录用户以及auth.models.User
附带的所有其他好处都没有收到,例如,我不能对以这种方式创建的用户使用authenticate
。User.objects.create_user("<username>", "<email>", "<password>")
。以这种方式做事没有问题,你可以使用django的auth
应用程序附带的所有免费内容。我的问题是,为什么会这样?
答案 0 :(得分:1)
查看create_user
方法,您会发现密码使用set_password
方法。
def create_user(self, username, email=None, password=None):
"""
Creates and saves a User with the given username, email and password.
"""
now = timezone.now()
if not username:
raise ValueError('The given username must be set')
email = UserManager.normalize_email(email)
user = self.model(username=username, email=email,
is_staff=False, is_active=True, is_superuser=False,
last_login=now, date_joined=now)
user.set_password(password)
user.save(using=self._db)
return user
答案 1 :(得分:0)
Django的密码不会存储为简单文本,即密码本身。它实际上是Django用于验证给定密码(docs)的哈希字符串。
答案 2 :(得分:0)
原因是因为create_user
函数是一个帮助函数,它接受你为密码输入的值并通过Django's password hasher运行它,它带有一个“明确密码”,如“我喜欢猫”并使其更安全存储为“0mvu3kmiXHh $ qhVGuNyO9cvV5spWeFrt9 / ZhIR81GcvAGVKMgILwpkU =”。因此,当您使用create
代替create_user
时,您只是传递了一个“明确的”密码作为密码,这将无法正常工作,因为当用户键入“我喜欢猫”时它将是哈希并且比较,因为你直接设置密码而不是使用Django的hasher而失败。