django實(shí)現(xiàn)登錄時候輸入密碼錯誤5次鎖定用戶十分鐘
在學(xué)習(xí)django的時候,想要實(shí)現(xiàn)登錄失敗后,進(jìn)行用戶鎖定,切記錄鎖定時間,在網(wǎng)上找了很多資料,但是都感覺不是那么靠譜,于是乎,我開始了我的設(shè)計(jì),其實(shí)我一開始想要借助redis呢,但是想要先開發(fā)一個簡單的,后續(xù)在拆分后,然后在去進(jìn)行拆分, 這樣也是很接近我們在真實(shí)的開發(fā)中所遇到問題。
我的思路是:
輸入賬號密碼》是否已經(jīng)登錄》提示已經(jīng)登錄
輸入賬號密碼》錯誤次數(shù)少于6次》校驗(yàn)密碼》登錄成功,記錄登錄時間,錯誤次數(shù)清空,記錄登錄狀態(tài)
輸入賬號密碼》錯誤大于六次》提示鎖定,并且記錄錯誤次數(shù)
輸入賬號密碼》是否凍結(jié)》提示凍結(jié)
這樣我們就來設(shè)計(jì)我們的數(shù)據(jù)庫:
class User(AbstractUser): avatar=models.ImageField(upload_to='vaatar/%Y/%m',default='vaatar/default/pang') qq=models.CharField(u'qq號碼', max_length=20,blank=True) mobile=models.CharField(u'手機(jī)號',max_length=11,blank=True,null=True,unique=True) login_sta = models.CharField(u'登錄是否鎖定', max_length=2, default=0) login_suo = models.DateTimeField(u'登錄鎖定時間') pass_errnum=models.IntegerField(u'用戶密碼輸入次數(shù)',default=0) is_login = models.BooleanField(default=False) class Meta: verbose_name = u'用戶' verbose_name_plural = verbose_name ordering=['-id'] def __str__(self) : return self.username
這里的用戶集成了django默認(rèn)的用戶來進(jìn)行設(shè)計(jì)的,
那么我們同步我們的數(shù)據(jù)庫。
同步后我們來看看我們的數(shù)據(jù)庫,
整體結(jié)構(gòu)出來了,我們來設(shè)計(jì)我們的登錄用戶的視圖,這里還是采用面向?qū)ο蟮姆绞絹碓O(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è)備!'}) if user.login_sta==True: return render(request, 'login.html', {'msg': '賬號已經(jīng)凍結(jié)!'}) if (datetime.datetime.now()-user.login_suo).total_seconds() <600: return render(request, 'login.html', {'msg': '賬號鎖定十分鐘內(nèi)不能登陸!'}) if user.pass_errnum>5: user.login_suo=datetime.datetime.now() return render(request, 'login.html', {'msg': '密碼輸入超過5次,用戶鎖定十分鐘'}) 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': '密碼錯誤'}) except: return render(request,'login.html',{'msg':'用戶名不存在!'})
整體的思路以及實(shí)現(xiàn),我們來實(shí)驗(yàn)下,這里的補(bǔ)充下,之前的我們的注冊的密碼,是按照原來的直接儲存密碼的,這樣來說是不安全的,我們來使用django自帶的進(jìn)行密碼加密解密。
我們來體驗(yàn)下我們的程序!
用戶已經(jīng)登錄了,我們在另一臺設(shè)備來退出我們的賬號就可以
這樣我們輸入6次,就鎖定了這個賬號,同時也給我們記錄了鎖定時間。
其實(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)給修改下。這樣一個簡單的限制用戶登錄時候輸入密碼次數(shù)的鎖定就這么簡單的實(shí)現(xiàn)了。
這樣一個簡單的django限制用戶登錄的時候密碼輸入次數(shù)就得到了解決。個人感覺十分方便。
這樣做可能后期用戶量大,會增加數(shù)據(jù)庫的壓力,后續(xù)可以吧這一塊優(yōu)化到我們的redis服務(wù)器中去。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python答題卡識別并給出分?jǐn)?shù)的實(shí)現(xiàn)代碼
本文帶領(lǐng)大家學(xué)習(xí)Python答題卡識別并給出分?jǐn)?shù)的實(shí)現(xiàn)代碼,代碼實(shí)現(xiàn)思路清晰,簡單易懂,Python識別答題卡相關(guān)知識感興趣的朋友一起看看吧2021-06-06Python+tkinter實(shí)現(xiàn)音樂下載軟件的制作
平常我們下載的歌曲,都是各種妖魔鬼怪的格式橫行,想下載下來用一下都不行,還只能在它的播放器內(nèi)聽,這誰受得了~本文就來用Python制作個音樂下載軟件,需要的可以參考一下2022-09-09pandas實(shí)現(xiàn)datetime64與unix時間戳互轉(zhuǎn)
這篇文章主要介紹了pandas實(shí)現(xiàn)datetime64與unix時間戳互轉(zhuǎn),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-07-07Python處理字符串的常用函數(shù)實(shí)例總結(jié)
在數(shù)據(jù)分析中,特別是文本分析中,字符處理需要耗費(fèi)極大的精力,因而了解字符處理對于數(shù)據(jù)分析而言,也是一項(xiàng)很重要的能力,這篇文章主要給大家介紹了關(guān)于Python處理字符串的常用函數(shù),需要的朋友可以參考下2021-11-11詳解BeautifulSoup獲取特定標(biāo)簽下內(nèi)容的方法
這篇文章主要介紹了詳解BeautifulSoup獲取特定標(biāo)簽下內(nèi)容的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12Python多進(jìn)程同步簡單實(shí)現(xiàn)代碼
這篇文章主要介紹了Python多進(jìn)程同步簡單實(shí)現(xiàn)代碼,涉及Python基于Process與Lock模塊運(yùn)行進(jìn)程與鎖機(jī)制實(shí)現(xiàn)多進(jìn)程同步的相關(guān)技巧,需要的朋友可以參考下2016-04-04