1. 程式人生 > >Django 實現密碼加密的使用者登入

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,才會去驗證賬號密碼在資料庫中。只有驗證成功,才能登陸進去。
在這裡插入圖片描述
在這裡插入圖片描述