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