使用Django Shell创建用户后无法登录,authenticate返回NoneType
解决Django中authenticate返回None的问题
嗨,这个问题我之前也踩过坑!根源其实很明确:你用User.objects.create()创建用户的时候,密码是直接以明文存在数据库里的,但Django的authenticate()方法只认经过哈希处理后的密码,所以哪怕你输入的密码字符串完全正确,验证也会失败,返回None。
给你两个实用的解决方案:
方案一:用正确的方法创建用户(推荐)
Django专门提供了create_user()方法来创建用户,它会自动帮你完成密码哈希的工作,用这个方法创建的用户就能正常通过验证:
>>> from django.contrib.auth.models import User >>> from django.contrib.auth import authenticate >>> # 用create_user创建用户,自动处理密码哈希 >>> User.objects.create_user(username='user', password='password', email='someemail') >>> # 现在再尝试验证 >>> authenticated_user = authenticate(username='user', password='password') >>> print(authenticated_user) # 会输出<User: user>,验证成功
方案二:修复已创建的用户
如果你已经用create()创建了用户,不想重新创建的话,可以手动给用户设置哈希后的密码:
>>> # 获取已存在的用户对象 >>> user = User.objects.get(username='user') >>> # 用set_password方法生成哈希密码并设置 >>> user.set_password('password') >>> # 一定要保存修改! >>> user.save() >>> # 现在验证就没问题了 >>> authenticate(username='user', password='password') # 返回用户对象
补充一句:Django对用户密码的存储有严格要求,必须用PBKDF2等安全算法哈希后存储,create()方法只是普通的模型创建方法,不会处理密码的哈希逻辑,所以创建用户一定要用create_user()(创建超级用户用createsuperuser命令)。
内容的提问来源于stack exchange,提问作者Denis Svistunov
相关产品推荐
相关产品推荐

