Python 中Django驗(yàn)證碼功能的實(shí)現(xiàn)代碼
為了防止機(jī)器人頻繁登陸網(wǎng)站或者破壞分子惡意登陸,很多用戶(hù)登錄和注冊(cè)系統(tǒng)都提供了圖形驗(yàn)證碼功能。
驗(yàn)證碼(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自動(dòng)區(qū)分計(jì)算機(jī)和人類(lèi)的圖靈測(cè)試)的縮寫(xiě),是一種區(qū)分用戶(hù)是計(jì)算機(jī)還是人的公共全自動(dòng)程序??梢苑乐箰阂馄平饷艽a、刷票、論壇灌水,有效防止某個(gè)黑客對(duì)某一個(gè)特定注冊(cè)用戶(hù)用特定程序暴力破解方式進(jìn)行不斷的登陸嘗試。
圖形驗(yàn)證碼的歷史比較悠久,到現(xiàn)在已經(jīng)有點(diǎn)英雄末路的味道了。因?yàn)闄C(jī)器學(xué)習(xí)、圖像識(shí)別的存在,機(jī)器人已經(jīng)可以比較正確的識(shí)別圖像內(nèi)的字符了。但不管怎么說(shuō),作為一種防御手段,至少還是可以抵擋一些低級(jí)入門(mén)的攻擊手段,抬高了攻擊者的門(mén)檻。
驗(yàn)證碼功能實(shí)現(xiàn)方法1——完整的驗(yàn)證碼實(shí)現(xiàn)流程
1, 驗(yàn)證碼前端畫(huà)布頁(yè)面生成
那么下面我們將依次生成驗(yàn)證碼這種畫(huà)布,左邊框是輸入驗(yàn)證碼的內(nèi)容,右邊框是設(shè)計(jì)驗(yàn)證碼。
1.1,直接讀取圖片
首先,我們需要了解讀取圖片的方法。
這樣我們知道方法就行,不建議使用,因?yàn)檫@樣讀取文件,我們需要存很多文件。
1.2,硬盤(pán)操作
首先,我們需要導(dǎo)入庫(kù),圖像處理庫(kù)Pillow,如果沒(méi)有的話,需要先安裝pillow庫(kù)。
其次,我們創(chuàng)建一個(gè)定義隨機(jī)顏色方法的函數(shù)。這函數(shù)的意義就是定義畫(huà)布的背景顏色。
如何定義顏色隨機(jī)呢?,因?yàn)槿玆,G,B的范圍都是0-255,我們隨機(jī)取0-255里面的某一個(gè)整數(shù),就得到了隨機(jī)顏色。代碼如下:
然后我們?cè)O(shè)定畫(huà)布的大小,定義畫(huà)布的寬和高。然后寫(xiě)一塊區(qū)域,最后展示在前端頁(yè)面。
1.3,內(nèi)存操作
其實(shí)硬盤(pán)操作,我們也不建議使用,最好的方法是建議使用內(nèi)存操作。在上線中大多體驗(yàn)者需要的是速度,如果速度不夠快,那就會(huì)放棄這個(gè)APP,所以我們一般犧牲其空間復(fù)雜度,換取時(shí)間復(fù)雜度。
那內(nèi)存操作如何做呢?首先,我們獲取一個(gè)緩存區(qū),然后將圖片保存到緩存區(qū),最后使用一個(gè).getvalue的函數(shù)方法將緩存區(qū)的內(nèi)容返回給前端。
.getvalue 是把緩存區(qū)的所有數(shù)據(jù)讀取。
bytesIO() 是使用io 獲取一個(gè)緩存區(qū),然后將圖片保存到緩存區(qū),最后讀取緩存區(qū)的數(shù)據(jù)。
這樣的話,一個(gè)前端畫(huà)布就生成了,不僅生成了,我們還解決了速度問(wèn)題,而且每次刷新,后臺(tái)都會(huì)傳出不同顏色的畫(huà)布。
1.4 效果圖
驗(yàn)證碼在前端顯示,肯定是左邊一格,右邊一格。最后設(shè)計(jì)出來(lái)的畫(huà)布效果是這樣的。
那下面,我們需要給畫(huà)布里面添加文字了。
2,如何給面板里加文字
我們需要導(dǎo)入繪圖庫(kù) ImageDraw, 繪圖字體庫(kù) ImageFont。還需要下載一個(gè)字體樣式,直接使用網(wǎng)上的字體樣式會(huì)比較簡(jiǎn)單。
2.1,ttf字體下載
我們可以在網(wǎng)上下載一個(gè)ttf字體文件。選擇一個(gè)自己喜歡的字體形式,下載。我這里下載了三個(gè),這里我使用第三個(gè) Vera.ttf字體。
2.2 添加文字
一般情況下,驗(yàn)證碼都是由四到八位不等的數(shù)字,大小寫(xiě)字母組成。我們這里選擇五位,其中每個(gè)位里面讓隨機(jī)生成一個(gè)大寫(xiě)字母,或者小寫(xiě)字母,或者數(shù)字。然后將其保存下來(lái)。這就是一個(gè)簡(jiǎn)單的驗(yàn)證碼就生成了。
代碼如下:
2.3 效果圖
驗(yàn)證碼里面添加五個(gè)文字,最后設(shè)計(jì)出來(lái)的添加文字的畫(huà)布效果是這樣的。
3,加上噪點(diǎn)噪線
其實(shí)上面差不多已經(jīng)完成了驗(yàn)證碼的操作,但是這是比較簡(jiǎn)單的驗(yàn)證碼,一般的圖片驗(yàn)證碼機(jī)器就可以識(shí)別了。我們需要添加一些難度,比如噪點(diǎn)噪線。
加噪點(diǎn)噪線也是為了減輕暴力請(qǐng)求,一般的圖片驗(yàn)證碼機(jī)器就可以識(shí)別出來(lái),所以我們加點(diǎn)難度,這樣可以減輕服務(wù)器的壓力。
下面代碼中,width和height是前端畫(huà)布的寬和高,第一個(gè)for循環(huán)是噪點(diǎn)的加入,第二個(gè)for循環(huán)是噪線的加入。
x1, y1, x2, y2 則表示需要四個(gè)坐標(biāo)。
3.1 效果圖
驗(yàn)證碼里面添加噪點(diǎn)噪線,因?yàn)槲疫€要使用,所以噪點(diǎn)噪線的效果就添加了一點(diǎn)點(diǎn)而已,如果需要復(fù)雜,可以添加內(nèi)容就像,最后設(shè)計(jì)出來(lái)的添加噪點(diǎn)噪線的畫(huà)布效果是這樣的。
4,驗(yàn)證碼局部刷新
為什么要做驗(yàn)證碼局部刷新呢?從使用者的角度來(lái)說(shuō),我們也知道,當(dāng)前端顯示的驗(yàn)證碼看不清楚,我們就需要刷新一下,但是不可能不停的提交表單,這樣的話,服務(wù)器的壓力就太大了。所以這時(shí)候局部刷新就優(yōu)勢(shì)就顯現(xiàn)出來(lái)了,我們需要局部刷新,很多人就想到了Ajax,沒(méi)錯(cuò),這是可以用,但是這里說(shuō)一種比較簡(jiǎn)單的局部刷新的方法。
我們可以看一個(gè)例子:
從上面,我們發(fā)現(xiàn)可以使用增加字符的方式,實(shí)現(xiàn)局部刷新,那么我們也可以采取這么簡(jiǎn)單的方法,直接刷新驗(yàn)證碼就行了。
下面展示其代碼:
views.py
前端代碼:
5,cookie與session保存驗(yàn)證碼
將隨機(jī)驗(yàn)證碼存儲(chǔ)到session中,就是需要記錄給哪個(gè)請(qǐng)求發(fā)了什么驗(yàn)證碼。
為什么這么說(shuō)呢?因?yàn)榈綍r(shí)候使用登錄驗(yàn)證的使用者不止一個(gè)人,那么服務(wù)端發(fā)送的驗(yàn)證碼不記錄給哪個(gè)請(qǐng)求發(fā)送的驗(yàn)證碼,當(dāng)好幾個(gè)人同時(shí)請(qǐng)求驗(yàn)證碼信息,然后提交,這樣就會(huì)發(fā)生混淆。所以保險(xiǎn)起見(jiàn),我們使用session保存驗(yàn)證碼。
views.py
login.html
index.html
views.py
validCode.py
驗(yàn)證碼功能實(shí)現(xiàn)方法2——captcha
在Django中實(shí)現(xiàn)圖片驗(yàn)證碼功能非常簡(jiǎn)單,有現(xiàn)成的第三方庫(kù)可以使用,我們不必自己開(kāi)發(fā)(但是也需要自己能開(kāi)發(fā)的出來(lái),方法二將自己開(kāi)發(fā)的圖片驗(yàn)證碼模塊)。這個(gè)庫(kù)叫做django-simple-captcha。
1,安裝 captcha
直接使用pip 按照
Django 自動(dòng)幫我們安裝了相關(guān)的依賴(lài)庫(kù) six, olefile 和 pillow ,其中Pillow是大名鼎鼎的繪圖模塊。
2,注冊(cè)captcha
在settings.py中,將'captcha' 注冊(cè)到APP列表里。
captcha 需要在數(shù)據(jù)庫(kù)中建立自己的數(shù)據(jù)表,所以需要執(zhí)行migrate命名生成數(shù)據(jù)表:
3,添加URL路由
我們還需要在根目錄下的urls.py文件添加 captcha 對(duì)應(yīng)的網(wǎng)址:
4,修改 myforms.py
如果上面都OK了,就可以直接在MyForms.py文件中添加CaptchaField了。
注意:我們需要提前導(dǎo)入form captcha.fields import CaptchaField ,然后就像寫(xiě)普通的form字段一樣添加一個(gè)captcha字段就可以了。
5,HTML文件的使用(修改 login.html文件)
由于我們這里直接學(xué)習(xí)驗(yàn)證碼,所以我這里直接寫(xiě)一個(gè)簡(jiǎn)單的login.html頁(yè)面,添加 capthca的相關(guān)內(nèi)容。
這里額外的添加了一條 {{ login_form.captcha.errors }} 用于明確指示用戶(hù),你的驗(yàn)證碼不正確。其中驗(yàn)證圖形碼是否正確的工作都是在后臺(tái)自動(dòng)完成的。只需要使用is_valid()這個(gè)myforms內(nèi)置的驗(yàn)證方法就一起進(jìn)行了,完全不需要再視圖函數(shù)中添加任何的驗(yàn)證代碼,非常方便快捷!
6,查看效果
直接的效果進(jìn)入頁(yè)面的效果如下:
我們輸入錯(cuò)驗(yàn)證碼的效果如下:
當(dāng)然我們還可以添加多種效果,這里就不做添加了,就實(shí)現(xiàn)簡(jiǎn)單的驗(yàn)證碼功能即可。
7,附帶的代碼
models.py
views.py
驗(yàn)證碼功能實(shí)現(xiàn)方法3——極驗(yàn)驗(yàn)證SDK
一,Django極驗(yàn)滑動(dòng)驗(yàn)證碼的使用
1,官網(wǎng)直接注冊(cè)賬號(hào)申請(qǐng)key和value
極驗(yàn)滑動(dòng)驗(yàn)證碼官網(wǎng):www.geetest.com
2,從Github: gt3-python-sdk下載.zip
文件3,找到里面Django 的文件夾對(duì)照官網(wǎng)直接copy4,代碼
views.py
urls.py
login.html
知識(shí)儲(chǔ)備一:pillow模塊的學(xué)習(xí)
PIL:Python Imaging Library,已經(jīng)是Python平臺(tái)上的圖像處理標(biāo)準(zhǔn)庫(kù)了。由于PIL僅支持到Python2.7 ,加上年久失修,于是一群志愿者在PIL的基礎(chǔ)上創(chuàng)建了兼容的版本,名字叫Pillow,支持最新版本的Python3.X,又加了許多新特性。因此,我們可以直接安裝使用Pillow。
(此處pillow的模塊的學(xué)習(xí)摘抄與網(wǎng)友灬魑魅魍魎灬,如有侵權(quán),請(qǐng)聯(lián)系我,立刪)
1,PIL的基本概念
PIL中所涉及的基本概念有如下幾個(gè):通道(bands)、模式(mode)、尺寸(size)、坐標(biāo)系統(tǒng)(coordinate system)、調(diào)色板(palette)、信息(info)和濾波器(filters)。
1.1 通道
每張圖片都是由一個(gè)或者多個(gè)數(shù)據(jù)通道構(gòu)成。PIL允許在單張圖片中合成相同維數(shù)和深度的多個(gè)通道。
以RGB圖像為例,每張圖片都是由三個(gè)數(shù)據(jù)通道構(gòu)成,分別為R、G和B通道。而對(duì)于灰度圖像,則只有一個(gè)通道。
對(duì)于一張圖片的通道數(shù)量和名稱(chēng),可以通過(guò)方法getbands()來(lái)獲取。方法getbands()是Image模塊的方法,它會(huì)返回一個(gè)字符串元組(tuple)。該元組將包括每一個(gè)通道的名稱(chēng)。
Python的元組與列表類(lèi)似,不同之處在于元組的元素不能修改,元組使用小括號(hào),列表使用方括號(hào),元組創(chuàng)建很簡(jiǎn)單,只需要在括號(hào)中添加元素,并使用逗號(hào)隔開(kāi)即可。
方法getbands()的使用如下:
1.2 模式
圖像的模式定義了圖像的類(lèi)型和像素的位寬。當(dāng)前支持如下模式:
可以通過(guò)mode屬性讀取圖像的模式。其返回值是包括上述模式的字符串。
屬性mode的使用如下:
1.3 尺寸
通過(guò)size屬性可以獲取圖片的尺寸。這是一個(gè)二元組,包含水平和垂直方向上的像素?cái)?shù)。
屬性mode的使用如下:
1.4 坐標(biāo)系統(tǒng)
PIL使用笛卡爾像素坐標(biāo)系統(tǒng),坐標(biāo)(0,0)位于左上角。注意:坐標(biāo)值表示像素的角;位于坐標(biāo)(0,0)處的像素的中心實(shí)際上位于(0.5,0.5)。
坐標(biāo)經(jīng)常用于二元組(x,y)。長(zhǎng)方形則表示為四元組,前面是左上角坐標(biāo)。例如,一個(gè)覆蓋800x600的像素圖像的長(zhǎng)方形表示為(0,0,800,600)。
1.5 調(diào)色板
調(diào)色板模式("P")使用一個(gè)顏色調(diào)色板為每個(gè)像素定義具體的顏色值
1.6 信息
使用info屬性可以為一張圖片添加一些輔助信息。這個(gè)是字典對(duì)象。加載和保存圖像文件時(shí),多少信息需要處理取決于文件格式。
屬性info的使用如下:
1.7 濾波器
對(duì)于將多個(gè)輸入像素映射為一個(gè)輸出像素的幾何操作,PIL提供了四個(gè)不同的采樣濾波器。
Image模塊中的方法 resize() 和 thumbnail()用到了濾波器。
方法resize() 的使用如下:
對(duì)參數(shù)filter不賦值的話,方法resize()默認(rèn)使用NEAREST濾波器。如果要使用其他濾波器可以通過(guò)下面的方法來(lái)實(shí)現(xiàn):
2,Image模塊
Image模塊是PIL中最重要的模塊,它有一個(gè)類(lèi)叫做image,與模塊名稱(chēng)相同。Image類(lèi)有很多函數(shù),方法及屬性,接下來(lái)將依次對(duì)image類(lèi)的屬性,函數(shù)和方法進(jìn)行介紹。
2.1 Image類(lèi)的屬性
1,F(xiàn)ormat
2,Mode
3,Size
4,Palette
5,Info
2.2 類(lèi)的函數(shù)
1,new
2,Open
3,Blend
4,Composite
5,Eval
6,F(xiàn)ormbuffer
7,F(xiàn)ormstring
8,Merge
3,Image類(lèi)的方法
除非另做說(shuō)明,Image類(lèi)的所有方法都將返回一個(gè)Image類(lèi)的新實(shí)例,這個(gè)實(shí)例對(duì)應(yīng)于結(jié)果圖像。
1,Convert
2,Copy
3,Crop
4,Draft
5,F(xiàn)ilter
6,F(xiàn)romstring
7,Getbands
8,Getbbox
9,Getcolors
10,Getdata
11,Getextrema
12,Getpixel
13,histogram
14,load
15,Paste
二:python中chr() 函數(shù) 和 ord() 函數(shù)的用法。
1,chr()函數(shù)
格式: Chr(<數(shù)值表達(dá)式>)
說(shuō)明:chr() 用一個(gè)范圍在 range(256)內(nèi)的(就是0~255)整數(shù)做參數(shù)。函數(shù)返回值類(lèi)型為String,其數(shù)值表達(dá)式值取值范圍為0~255,返回一個(gè)對(duì)應(yīng)的字符(對(duì)應(yīng)的ASCII字符)。
例如:Print(Chr(78)) 結(jié)果顯示:N
65-90 大寫(xiě)A-Z
97-122 小寫(xiě)的a-z
2,ord() 函數(shù)
格式: ord("字符串")
說(shuō)明:函數(shù)返回值類(lèi)型為int
例如:Print(ord('0')) 結(jié)果顯示:48
總結(jié)
以上所述是小編給大家介紹的Python 中Django驗(yàn)證碼功能的實(shí)現(xiàn)代碼,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)歡迎給我留言,小編會(huì)及時(shí)回復(fù)大家的!
相關(guān)文章
Python實(shí)現(xiàn)加密的RAR文件解壓的方法(密碼已知)
這篇文章主要介紹了Python實(shí)現(xiàn)加密的RAR文件解壓,本文分步驟給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09Python+matplotlib實(shí)現(xiàn)簡(jiǎn)單曲線的繪制
Matplotlib是Python的繪圖庫(kù),它能讓使用者很輕松地將數(shù)據(jù)圖形化,并且提供多樣化的輸出格式。本文將利用matplotlib繪制簡(jiǎn)單的曲線圖,感興趣的朋友可以學(xué)習(xí)一下2022-04-04Django REST Framework序列化外鍵獲取外鍵的值方法
今天小編就為大家分享一篇Django REST Framework序列化外鍵獲取外鍵的值方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-07-07python代碼實(shí)現(xiàn)煙花實(shí)例
這篇文章主要給大家分享了python煙花詳細(xì)的代碼,文章主要以python煙花的代碼展開(kāi)全文,所以解說(shuō)會(huì)比較少,代碼較多。喜歡的小伙伴可以參考一下,希望對(duì)你有所幫助2021-12-12python如何實(shí)現(xiàn)質(zhì)數(shù)求和
這篇文章主要介紹了python如何實(shí)現(xiàn)質(zhì)數(shù)求和,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05python創(chuàng)建與遍歷二叉樹(shù)的方法實(shí)例
這篇文章主要給大家介紹了關(guān)于python創(chuàng)建與遍歷二叉樹(shù)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03