问题描述
使用auth.authenticate(username= username,passowrd=passowrd)
,这个用户认证时候,明明数据库中有记录且账号密码都正确,但是返回就None
解决方案
有如下两种方案:
(1)使用了自己创建的用户表,并没有添加到在auth_user(django自带的表)中,从而导致auth.authenticate()根本查不到响应的数据
解决方法:改用auth_user表存储用户相关信息,或者抛弃auth.authenticate()这个方法
(2)检查自己数据库中的auth_user表中,密码是否为明文,如果是,那是因为使用了User.objects.create()
,这样插进去的数据密码是明文,所以导致了auth.authenticate()根本查不到响应的数据,需要改为User.objects.create_user(username=username,password=password)插入数据,这个方法会把密码生成哈希值
注册登录代码参考:
def login_view(request):
form = forms.LoginForm(request.POST or None)
msg = None
if request.method == "POST":
# 判断数据是否合法
if form.is_valid():
# 从form表单中获取数据
username = form.cleaned_data.get("username")
logger.info(type(username))
# username = username.strip()
password = form.cleaned_data.get("password")
role = form.cleaned_data.get("role")
logger.info("username = {},password = {},role={}".format(username, password, role))
user = authenticate(username=username, password=password)
if user is not None:
# 使用seesion 来记录username
request.session['username'] = username
# 通过login() 来存储用户信息 存储在cookies里 但是获取的cookies里的值是不规则的
login(request, user)
return HttpResponseRedirect(reverse('home', args=(username,)))
else:
msg = 'Username or Password invalid'
else:
msg = 'Error : validating the form'
logger.info(msg)
return render(request, "accounts/login.html", {"form": form, "msg": msg})
@login_required
def logout_view(request):
logout(request)
# 登出就删除所有session
request.session.flush()
return redirect('/login')
def register_user(request):
msg = None
success = False
if request.method == "POST":
form = forms.SignUpForm(request.POST)
if form.is_valid():
# form.save()
username = form.cleaned_data.get("username")
password = form.cleaned_data.get("password1")
password_check = form.cleaned_data.get("password2")
email = form.cleaned_data.get("email")
if (UserInfo.objects.filter(username=username).exists()):
msg = "用户已存在"
elif (password != password_check):
msg = "两次输入密码不一致"
else:
msg = '用户已创立 - 请 <a href="/login">登录</a>.'
success = True
UserInfo.objects.create_user(username=username, password=password,email=email)
else:
msg = 'Form is not valid'
else:
form = forms.SignUpForm()
return render(request, "accounts/register.html", {"form": form, "msg": msg, "success": success})