django實(shí)現(xiàn)登錄時(shí)候輸入密碼錯(cuò)誤5次鎖定用戶(hù)十分鐘
在學(xué)習(xí)django的時(shí)候,想要實(shí)現(xiàn)登錄失敗后,進(jìn)行用戶(hù)鎖定,切記錄鎖定時(shí)間,在網(wǎng)上找了很多資料,但是都感覺(jué)不是那么靠譜,于是乎,我開(kāi)始了我的設(shè)計(jì),其實(shí)我一開(kāi)始想要借助redis呢,但是想要先開(kāi)發(fā)一個(gè)簡(jiǎn)單的,后續(xù)在拆分后,然后在去進(jìn)行拆分, 這樣也是很接近我們?cè)谡鎸?shí)的開(kāi)發(fā)中所遇到問(wèn)題。
我的思路是:
輸入賬號(hào)密碼》是否已經(jīng)登錄》提示已經(jīng)登錄
輸入賬號(hào)密碼》錯(cuò)誤次數(shù)少于6次》校驗(yàn)密碼》登錄成功,記錄登錄時(shí)間,錯(cuò)誤次數(shù)清空,記錄登錄狀態(tài)
輸入賬號(hào)密碼》錯(cuò)誤大于六次》提示鎖定,并且記錄錯(cuò)誤次數(shù)
輸入賬號(hào)密碼》是否凍結(jié)》提示凍結(jié)
這樣我們就來(lái)設(shè)計(jì)我們的數(shù)據(jù)庫(kù):
class User(AbstractUser):
avatar=models.ImageField(upload_to='vaatar/%Y/%m',default='vaatar/default/pang')
qq=models.CharField(u'qq號(hào)碼', max_length=20,blank=True)
mobile=models.CharField(u'手機(jī)號(hào)',max_length=11,blank=True,null=True,unique=True)
login_sta = models.CharField(u'登錄是否鎖定', max_length=2, default=0)
login_suo = models.DateTimeField(u'登錄鎖定時(shí)間')
pass_errnum=models.IntegerField(u'用戶(hù)密碼輸入次數(shù)',default=0)
is_login = models.BooleanField(default=False)
class Meta:
verbose_name = u'用戶(hù)'
verbose_name_plural = verbose_name
ordering=['-id']
def __str__(self) :
return self.username
這里的用戶(hù)集成了django默認(rèn)的用戶(hù)來(lái)進(jìn)行設(shè)計(jì)的,
那么我們同步我們的數(shù)據(jù)庫(kù)。
同步后我們來(lái)看看我們的數(shù)據(jù)庫(kù),

整體結(jié)構(gòu)出來(lái)了,我們來(lái)設(shè)計(jì)我們的登錄用戶(hù)的視圖,這里還是采用面向?qū)ο蟮姆绞絹?lái)設(shè)計(jì)我們的登錄視圖,
具體的實(shí)現(xiàn)如下:
from django.contrib.auth.hashers import make_password, check_password
from django.http import Http404, HttpResponseRedirect
from django.shortcuts import render, redirect
from django.views.generic.base import View
class LoginView(View):
def get(self,request):
return render(request, 'login.html')
def post(self,request):
next = request.META.get('HTTP_REFERER')
username=request.POST.get('username',None)
password=request.POST.get('password',None)
try:
user = User.objects.get(username= username)
if user.is_login==True:
return render(request, 'login.html', {'msg': '同時(shí)只能登陸一臺(tái)設(shè)備!'})
if user.login_sta==True:
return render(request, 'login.html', {'msg': '賬號(hào)已經(jīng)凍結(jié)!'})
if (datetime.datetime.now()-user.login_suo).total_seconds() <600:
return render(request, 'login.html', {'msg': '賬號(hào)鎖定十分鐘內(nèi)不能登陸!'})
if user.pass_errnum>5:
user.login_suo=datetime.datetime.now()
return render(request, 'login.html', {'msg': '密碼輸入超過(guò)5次,用戶(hù)鎖定十分鐘'})
if check_password(password,user.password) :
request.session['username'] = username
if '/logout' or '/reg' in next:
response = HttpResponseRedirect('/')
else:
response= HttpResponseRedirect(next)
user.last_login=datetime.datetime.now()
user.is_login=True
user.pass_errnum=0
user.save()
response.set_cookie('username', username, 3600)
return response
user.pass_errnum+=1
user.save()
return render(request, 'login.html', {'msg': '密碼錯(cuò)誤'})
except:
return render(request,'login.html',{'msg':'用戶(hù)名不存在!'})
整體的思路以及實(shí)現(xiàn),我們來(lái)實(shí)驗(yàn)下,這里的補(bǔ)充下,之前的我們的注冊(cè)的密碼,是按照原來(lái)的直接儲(chǔ)存密碼的,這樣來(lái)說(shuō)是不安全的,我們來(lái)使用django自帶的進(jìn)行密碼加密解密。
我們來(lái)體驗(yàn)下我們的程序!

用戶(hù)已經(jīng)登錄了,我們?cè)诹硪慌_(tái)設(shè)備來(lái)退出我們的賬號(hào)就可以

這樣我們輸入6次,就鎖定了這個(gè)賬號(hào),同時(shí)也給我們記錄了鎖定時(shí)間。

其實(shí)這里我們推出的模塊的設(shè)計(jì)如下:
class LogoutView(View):
def get(self,request):
try:
user = User.objects.get(username__exact=request.session['username'])
user.last_login=datetime.datetime.now()
user.is_login=False
user.save()
del request.session['username']
return render(request,'index.html')
except:
return HttpResponseRedirect('/')
退出我們就記錄退出的,把登錄狀態(tài)給修改下。這樣一個(gè)簡(jiǎn)單的限制用戶(hù)登錄時(shí)候輸入密碼次數(shù)的鎖定就這么簡(jiǎn)單的實(shí)現(xiàn)了。
這樣一個(gè)簡(jiǎn)單的django限制用戶(hù)登錄的時(shí)候密碼輸入次數(shù)就得到了解決。個(gè)人感覺(jué)十分方便。
這樣做可能后期用戶(hù)量大,會(huì)增加數(shù)據(jù)庫(kù)的壓力,后續(xù)可以吧這一塊優(yōu)化到我們的redis服務(wù)器中去。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
使用Python開(kāi)發(fā)一個(gè)圖像標(biāo)注與OCR識(shí)別工具
這篇文章主要介紹了一個(gè)使用Python開(kāi)發(fā)的工具,允許用戶(hù)在圖像上進(jìn)行矩形標(biāo)注,使用 OCR 對(duì)標(biāo)注區(qū)域進(jìn)行文本識(shí)別,并將結(jié)果保存為 Excel 文件,感興趣的可以了解下2025-03-03
python為Django項(xiàng)目上的每個(gè)應(yīng)用程序創(chuàng)建不同的自定義404頁(yè)面(最佳答案)
這篇文章主要介紹了python為Django項(xiàng)目上的每個(gè)應(yīng)用程序創(chuàng)建不同的自定義404頁(yè)面,本文給出了最佳答案,大家可以跟隨小編一起學(xué)習(xí)下2020-03-03
Python+OpenCV實(shí)現(xiàn)圖片及視頻中選定區(qū)域顏色識(shí)別
這篇文章主要為大家詳細(xì)介紹了如何利用Python+OpenCV實(shí)現(xiàn)圖片及視頻中選定區(qū)域顏色識(shí)別功能,文中的示例代碼講解詳細(xì),感興趣的可以了解一下2022-07-07
python爬蟲(chóng)面試寶典(常見(jiàn)問(wèn)題)
這篇文章主要介紹了python爬蟲(chóng)面試寶典及常見(jiàn)問(wèn)題小結(jié),需要的朋友可以參考下2018-03-03
apache部署python程序出現(xiàn)503錯(cuò)誤的解決方法
這篇文章主要給大家介紹了關(guān)于在apahce部署python程序出現(xiàn)503錯(cuò)誤的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)同樣遇到這個(gè)問(wèn)題的朋友們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-07-07
Python中實(shí)現(xiàn)從目錄中過(guò)濾出指定文件類(lèi)型的文件
這篇文章主要介紹了Python中實(shí)現(xiàn)從目錄中過(guò)濾出指定文件類(lèi)型的文件,本文是一篇學(xué)筆記,實(shí)例相對(duì)簡(jiǎn)單,需要的朋友可以參考下2015-02-02
簡(jiǎn)單介紹Python的Tornado框架中的協(xié)程異步實(shí)現(xiàn)原理
這篇文章主要介紹了簡(jiǎn)單介紹Python的Tornado框架中的協(xié)程異步實(shí)現(xiàn)原理,作者基于Python的生成器講述了Tornado異步的特點(diǎn),需要的朋友可以參考下2015-04-04

