Django 实现密码加密的用户登录

上一篇讲解的是实现密码不加密的用户登录,这次讲解密码加密的用户登录,其中配置以及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,才会去验证账号密码在数据库中。只有验证成功,才能登陆进去。
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/zhangmengran/article/details/83589922
今日推荐