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