使用两种不同的方式创建django用户

时间:2013-09-09 13:09:20

标签: python django django-models django-authentication

我尝试通过两种不同的方式在django中创建User s(django.contrib.auth.models.User):

  1. 使用User.objects.create(username="<username_here>", password="<password_here>", email="<email_here>) - &gt;当我使用它时,登录用户以及auth.models.User附带的所有其他好处都没有收到,例如,我不能对以这种方式创建的用户使用authenticate
  2. 使用User.objects.create_user("<username>", "<email>", "<password>")。以这种方式做事没有问题,你可以使用django的auth应用程序附带的所有免费内容。
  3. 我的问题是,为什么会这样?

3 个答案:

答案 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而失败。