【发布时间】:2020-11-13 05:21:33
【问题描述】:
在 Django 文档中,它使用User.objects.create_user() 创建用户。我很困惑,这和User.objects.create()和User().save()有什么区别,这是创建其他模型对象的正常方法
【问题讨论】:
标签: django django-models django-authentication
在 Django 文档中,它使用User.objects.create_user() 创建用户。我很困惑,这和User.objects.create()和User().save()有什么区别,这是创建其他模型对象的正常方法
【问题讨论】:
标签: django django-models django-authentication
最显着的区别是,如果您向.create() 方法提供密码,它将被逐字设置在用户身上,并且无法用于验证用户身份。
>>> user = User.objects.create(username="foo", password="bar")
>>> user.password
'bar'
>>> user.check_password("bar")
False
相反,create_user() 方法对密码参数进行哈希处理,然后是。
>>> user = User.objects.create_user(username="foo", password="bar")
>>> user.password
'pbkdf2_sha256$120000$2pHBVu3tYYbK$ESG1nbUY2ZhEmstJ7Fzu1DioXmGYXiLw31YDkOGn9E0='
>>> user.check_password("bar")
True
见https://github.com/django/django/blob/master/django/contrib/auth/models.py#L145。
其他一些“整理”也完成了。请参阅上面链接的其余函数。
【讨论】:
models.Model 而不是AbstractUser,因为我将使用oAuth2,所以我不需要密码字段。那么,我可以安全地使用create 函数,对吧?由于未扩展AbstractUser,create_user 将不可用。
create_user 方法还有一些其他有用的功能。您的建议是安全的,您可以使用settings.AUTH_USER_MODEL 来配置您的自定义用户,但请注意,除了密码字段之外,它还具有其他有用的功能。事实上django-oauth-toolkit.readthedocs.io 建议与标准AbstractUser 模型集成。您可以随时使用它以保持约定,而忽略密码字段。
create_user 函数的情况下创建 User 可能会导致其他依赖于加密密码的函数出现问题。例如,在测试期间,您可能希望用户为特定请求登录,例如 testing with DRF
你应该得到用户模型:
from django.contrib.auth import get_user_model
UserModel = get_user_model()
user = UserModel.objects.create(username="Mr Foo", password="bar")
user.save()
或者:
user = UserModel.objects.create_user("Mr Foo", password="bar")
user.save()
【讨论】:
create() 和 save() 是创建模型实例的通用方法。他们不做任何特定于 User 模型的事情,而 create_user() 方法是创建用户的特定方法。
使用泛型方法创建用户时,你设置为密码的值不会被hash。你需要像这样自己做。
u = User(username="username")
u.set_password("password")
u.save()
如果没有额外的数据库查询,您也不能对 create() 方法执行相同的操作。
使用create_user() 时,用户名和密码设置为给定,密码将自动进行哈希处理,返回的用户对象将is_active 设置为True
【讨论】:
User.objects.create_user() 是一个帮助函数,它提供有用的实用程序来创建用户,否则您必须自己做。根据文档:
创建、保存和返回用户
用户名和密码设置为给定。电子邮件的域部分会自动转换为小写,并且返回的用户对象会将
is_active设置为True。如果没有提供密码,将调用
set_unusable_password()。
extra_fields关键字参数被传递给用户的__init__方法,以允许在自定义用户模型上设置任意字段。
没有create_user(),您可以使用您提到的方法自己创建功能,但它提供了有用的处理和实用程序。
【讨论】: