这个问题绕了我好久,不停的和老师的代码对照,一模一样,又看了看django2.0的官方认证文档,无解纳闷了~~~
后来网上搜索找到办法
0x00问题
在确认数据库中存在该用户数据,并且我用户名和密码都是对的情况下,使用auth模块的authenticate认证,is_active=0时一直返回None,通过学习过程中了解到了一些解决办法。
0x01办法
法一:
使用django自带的auth.user类,在modles下自建的user下的账号,有时候authenticate() 会读取不到信息
- 这个还没用到过,也不会用,放这以后可能用的着
法二:
在账号注册的时候,插入函数要用对,要用objects.create_user()函数,如果用objects.create插入时以明文保存的,authenticate()函数通过加密后再进行对比,所以读不到。
- create_user() 这个函数会将密码自动加密,而不是明文保存
- authencate() 会将输入的明文密码,自动加密,然后去数据库匹配,如果匹配成功返回一个user对象,如果不成功,返回None
user = authenticate(request, username=username, password=password)
user = User.objects.create_user(username, email, password)
- 这个问题我稍微可以理解,主要是在开发中学了这几个函数
法三:
我在开发过程中就是这个问题,我太难了····
在我的版本django2.0下使用authenticate()验证会关联is_active字段。
当is_active=0时,默认不能通过我的第一个if判断(一图有标注),一直返回None。
- 在settings.py文件中加入一段配置
# 让authenticate不关联is_active
AUTHENTICATION_BACKENDS = ['django.contrib.auth.backends.AllowAllUsersModelBackend']
注:设置完这个后,重新运行程序没有用,得把pycharm关掉重新打开项目运行,并且之前通过注册写入数据库的数据不起作用,删了重新写入就好了,
- 删除数据库的数据命令
python manage.py flush
法四:
假若以上三种方法都没能解决问题,还有可以通过check_password来帮助解决问题