上一篇讲解的是实现密码不加密的用户登录,这次讲解密码加密的用户登录,其中配置以及HTML文件都一样。下面说一下改动的地方
在urls.py中绑定路由
path('one/', HashLoginView.as_view())
在views.py中创建一个通用视图:
class HashLoginView(View):
def get(self, request):
return render(request, 'login.html')
def post(self, request):
username = request.POST.get('account')
password = request.POST.get('password')
# 如果密码是加密的密码,需要使用Django的认证函数authenticate对账号密码进行认证。
"""
authenticate认证原理:
1. 先根据用户名去数据库中查询是否存在该用户,如果存在该用户,再验证密码是否正确,如果密码也正确,再验证该账号的is_active是否被激活(True就是激活了),如果账号也被激活了,此时返回这个usermodel对象;
2. 如果用户不存在,或者用户存在但密码是错的,都返回None;
"""
user = authenticate(username=username, password=password)
if user:
# 说明用户名和密码都是正确的。
# 使用login()函数尽心逻辑登录。
login(request, user)
# 登录成功以后,跳转到首页。
return redirect('/index/')
else:
# 如果数据不正确,不需要跳转url地址,也不需要跳转页面,就需要再渲染一下页面,展示错误信息即可。
return render(request, 'login.html', {'error': '用户名或密码错误'})
上面的写法,就是会导致,无论你在输入框输入什么,它都能使用Django的认证函数authenticate对账号密码进行认证。
下面,为了更加完善,我们实现另一种,在对账号密码进行认证之前,输入框进行输入的时候,就可以限制输入框的内容是什么类型,或者多长的字段,等等。
首先,在forms.py文件中,创建一个Form类,可以对输入框account进行最大字符为5的限制。
class LoginForm(forms.Form):
account = forms.CharField(required=True,max_length=5)
password = forms.CharField(required=True)
class HashLoginView(View):
def get(self, request):
return render(request, 'login.html')
def post(self, request):
# Html模版中自定义的<input>标签如何跟自定义表单结合使用。
# 主要就是使用了Form表单的数据检查功能,不在html模版中使用{{form}}这种形式生成input标签了。
# 注意:在自定义form表单中,表单的属性必须和<input>标签中name属性的值保持一致。
formdata = LoginForm(request.POST)
if formdata.is_valid():
username = formdata.cleaned_data['account']
password = formdata.cleaned_data['password']
user = authenticate(username=username, password=password)
if user:
login(request, user)
return redirect('/index/')
else:
return render(request, 'login.html', {'error': '用户名或密码不正确'})
else:
return render(request, 'login.html', {'error': '数据不合法'})
因为,在account字段中限制字符最大为5,那么最终可以测试一下是否完成其功能。
发现,account的字符大于5,就会提示“数据不合法”,也就不去对账号密码进行认证了
当account输入不大于5,才会去验证账号密码在数据库中。只有验证成功,才能登陆进去。