Django 實現密碼加密的使用者登入
阿新 • • 發佈:2018-12-26
上一篇講解的是實現密碼不加密的使用者登入,這次講解密碼加密的使用者登入,其中配置以及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,才會去驗證賬號密碼在資料庫中。只有驗證成功,才能登陸進去。