黄色网页视频 I 影音先锋日日狠狠久久 I 秋霞午夜毛片 I 秋霞一二三区 I 国产成人片无码视频 I 国产 精品 自在自线 I av免费观看网站 I 日本精品久久久久中文字幕5 I 91看视频 I 看全色黄大色黄女片18 I 精品不卡一区 I 亚洲最新精品 I 欧美 激情 在线 I 人妻少妇精品久久 I 国产99视频精品免费专区 I 欧美影院 I 欧美精品在欧美一区二区少妇 I av大片网站 I 国产精品黄色片 I 888久久 I 狠狠干最新 I 看看黄色一级片 I 黄色精品久久 I 三级av在线 I 69色综合 I 国产日韩欧美91 I 亚洲精品偷拍 I 激情小说亚洲图片 I 久久国产视频精品 I 国产综合精品一区二区三区 I 色婷婷国产 I 最新成人av在线 I 国产私拍精品 I 日韩成人影音 I 日日夜夜天天综合

Python 中Django驗證碼功能的實現(xiàn)代碼

系統(tǒng) 2321 0

  為了防止機(jī)器人頻繁登陸網(wǎng)站或者破壞分子惡意登陸,很多用戶登錄和注冊系統(tǒng)都提供了圖形驗證碼功能。

  驗證碼(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自動區(qū)分計算機(jī)和人類的圖靈測試)的縮寫,是一種區(qū)分用戶是計算機(jī)還是人的公共全自動程序。可以防止惡意破解密碼、刷票、論壇灌水,有效防止某個黑客對某一個特定注冊用戶用特定程序暴力破解方式進(jìn)行不斷的登陸嘗試。

  圖形驗證碼的歷史比較悠久,到現(xiàn)在已經(jīng)有點英雄末路的味道了。因為機(jī)器學(xué)習(xí)、圖像識別的存在,機(jī)器人已經(jīng)可以比較正確的識別圖像內(nèi)的字符了。但不管怎么說,作為一種防御手段,至少還是可以抵擋一些低級入門的攻擊手段,抬高了攻擊者的門檻。

驗證碼功能實現(xiàn)方法1――完整的驗證碼實現(xiàn)流程

1, 驗證碼前端畫布頁面生成

  那么下面我們將依次生成驗證碼這種畫布,左邊框是輸入驗證碼的內(nèi)容,右邊框是設(shè)計驗證碼。

1.1,直接讀取圖片

  首先,我們需要了解讀取圖片的方法。

  這樣我們知道方法就行,不建議使用,因為這樣讀取文件,我們需要存很多文件。

1.2,硬盤操作

  首先,我們需要導(dǎo)入庫,圖像處理庫Pillow,如果沒有的話,需要先安裝pillow庫。

  其次,我們創(chuàng)建一個定義隨機(jī)顏色方法的函數(shù)。這函數(shù)的意義就是定義畫布的背景顏色。

如何定義顏色隨機(jī)呢?,因為三原色R,G,B的范圍都是0-255,我們隨機(jī)取0-255里面的某一個整數(shù),就得到了隨機(jī)顏色。代碼如下:

  然后我們設(shè)定畫布的大小,定義畫布的寬和高。然后寫一塊區(qū)域,最后展示在前端頁面。

1.3,內(nèi)存操作

  其實硬盤操作,我們也不建議使用,最好的方法是建議使用內(nèi)存操作。在上線中大多體驗者需要的是速度,如果速度不夠快,那就會放棄這個APP,所以我們一般犧牲其空間復(fù)雜度,換取時間復(fù)雜度。

  那內(nèi)存操作如何做呢?首先,我們獲取一個緩存區(qū),然后將圖片保存到緩存區(qū),最后使用一個.getvalue的函數(shù)方法將緩存區(qū)的內(nèi)容返回給前端。

  .getvalue 是把緩存區(qū)的所有數(shù)據(jù)讀取。

  bytesIO() 是使用io 獲取一個緩存區(qū),然后將圖片保存到緩存區(qū),最后讀取緩存區(qū)的數(shù)據(jù)。

  這樣的話,一個前端畫布就生成了,不僅生成了,我們還解決了速度問題,而且每次刷新,后臺都會傳出不同顏色的畫布。

1.4 效果圖

  驗證碼在前端顯示,肯定是左邊一格,右邊一格。最后設(shè)計出來的畫布效果是這樣的。

Python 中Django驗證碼功能的實現(xiàn)代碼_第1張圖片

  那下面,我們需要給畫布里面添加文字了。

2,如何給面板里加文字

  我們需要導(dǎo)入繪圖庫 ImageDraw, 繪圖字體庫 ImageFont。還需要下載一個字體樣式,直接使用網(wǎng)上的字體樣式會比較簡單。

2.1,ttf字體下載

  我們可以在網(wǎng)上下載一個ttf字體文件。選擇一個自己喜歡的字體形式,下載。我這里下載了三個,這里我使用第三個 Vera.ttf字體。

2.2 添加文字

  一般情況下,驗證碼都是由四到八位不等的數(shù)字,大小寫字母組成。我們這里選擇五位,其中每個位里面讓隨機(jī)生成一個大寫字母,或者小寫字母,或者數(shù)字。然后將其保存下來。這就是一個簡單的驗證碼就生成了。

  代碼如下:

2.3 效果圖

  驗證碼里面添加五個文字,最后設(shè)計出來的添加文字的畫布效果是這樣的。

Python 中Django驗證碼功能的實現(xiàn)代碼_第2張圖片

3,加上噪點噪線

  其實上面差不多已經(jīng)完成了驗證碼的操作,但是這是比較簡單的驗證碼,一般的圖片驗證碼機(jī)器就可以識別了。我們需要添加一些難度,比如噪點噪線。

  加噪點噪線也是為了減輕暴力請求,一般的圖片驗證碼機(jī)器就可以識別出來,所以我們加點難度,這樣可以減輕服務(wù)器的壓力。

  下面代碼中,width和height是前端畫布的寬和高,第一個for循環(huán)是噪點的加入,第二個for循環(huán)是噪線的加入。

  x1, y1, x2, y2 則表示需要四個坐標(biāo)。

3.1 效果圖

   驗證碼里面添加噪點噪線,因為我還要使用,所以噪點噪線的效果就添加了一點點而已,如果需要復(fù)雜,可以添加內(nèi)容就像,最后設(shè)計出來的添加噪點噪線的畫布效果是這樣的。

Python 中Django驗證碼功能的實現(xiàn)代碼_第3張圖片

4,驗證碼局部刷新

  為什么要做驗證碼局部刷新呢?從使用者的角度來說,我們也知道,當(dāng)前端顯示的驗證碼看不清楚,我們就需要刷新一下,但是不可能不停的提交表單,這樣的話,服務(wù)器的壓力就太大了。所以這時候局部刷新就優(yōu)勢就顯現(xiàn)出來了,我們需要局部刷新,很多人就想到了Ajax,沒錯,這是可以用,但是這里說一種比較簡單的局部刷新的方法。

  我們可以看一個例子:

Python 中Django驗證碼功能的實現(xiàn)代碼_第4張圖片

  從上面,我們發(fā)現(xiàn)可以使用增加字符的方式,實現(xiàn)局部刷新,那么我們也可以采取這么簡單的方法,直接刷新驗證碼就行了。

  下面展示其代碼:

  views.py

  前端代碼:

5,cookie與session保存驗證碼

  將隨機(jī)驗證碼存儲到session中,就是需要記錄給哪個請求發(fā)了什么驗證碼。

  為什么這么說呢?因為到時候使用登錄驗證的使用者不止一個人,那么服務(wù)端發(fā)送的驗證碼不記錄給哪個請求發(fā)送的驗證碼,當(dāng)好幾個人同時請求驗證碼信息,然后提交,這樣就會發(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 按照

Python 中Django驗證碼功能的實現(xiàn)代碼_第5張圖片

  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 對應(yīng)的網(wǎng)址:

4,修改 myforms.py

  如果上面都OK了,就可以直接在MyForms.py文件中添加CaptchaField了。

  注意:我們需要提前導(dǎo)入form captcha.fields import CaptchaField ,然后就像寫普通的form字段一樣添加一個captcha字段就可以了。

5,HTML文件的使用(修改 login.html文件)

  由于我們這里直接學(xué)習(xí)驗證碼,所以我這里直接寫一個簡單的login.html頁面,添加 capthca的相關(guān)內(nèi)容。

  這里額外的添加了一條 {{ login_form.captcha.errors }} 用于明確指示用戶,你的驗證碼不正確。其中驗證圖形碼是否正確的工作都是在后臺自動完成的。只需要使用is_valid()這個myforms內(nèi)置的驗證方法就一起進(jìn)行了,完全不需要再視圖函數(shù)中添加任何的驗證代碼,非常方便快捷!

6,查看效果

  直接的效果進(jìn)入頁面的效果如下:

Python 中Django驗證碼功能的實現(xiàn)代碼_第6張圖片

  我們輸入錯驗證碼的效果如下:

Python 中Django驗證碼功能的實現(xiàn)代碼_第7張圖片

  當(dāng)然我們還可以添加多種效果,這里就不做添加了,就實現(xiàn)簡單的驗證碼功能即可。

7,附帶的代碼

  models.py

  views.py

驗證碼功能實現(xiàn)方法3――極驗驗證SDK

Python 中Django驗證碼功能的實現(xiàn)代碼_第8張圖片

一,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模塊的學(xué)習(xí)

  PIL:Python Imaging Library,已經(jīng)是Python平臺上的圖像處理標(biāo)準(zhǔn)庫了。由于PIL僅支持到Python2.7 ,加上年久失修,于是一群志愿者在PIL的基礎(chǔ)上創(chuàng)建了兼容的版本,名字叫Pillow,支持最新版本的Python3.X,又加了許多新特性。因此,我們可以直接安裝使用Pillow。

(此處pillow的模塊的學(xué)習(xí)摘抄與網(wǎng)友灬魑魅魍魎灬,如有侵權(quán),請聯(lián)系我,立刪)

1,PIL的基本概念

  PIL中所涉及的基本概念有如下幾個:通道(bands)、模式(mode)、尺寸(size)、坐標(biāo)系統(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 模式

  圖像的模式定義了圖像的類型和像素的位寬。當(dāng)前支持如下模式:

  可以通過mode屬性讀取圖像的模式。其返回值是包括上述模式的字符串。

  屬性mode的使用如下:

1.3 尺寸

  通過size屬性可以獲取圖片的尺寸。這是一個二元組,包含水平和垂直方向上的像素數(shù)。

  屬性mode的使用如下:

1.4 坐標(biāo)系統(tǒng)

  PIL使用笛卡爾像素坐標(biāo)系統(tǒng),坐標(biāo)(0,0)位于左上角。注意:坐標(biāo)值表示像素的角;位于坐標(biāo)(0,0)處的像素的中心實際上位于(0.5,0.5)。

  坐標(biāo)經(jīng)常用于二元組(x,y)。長方形則表示為四元組,前面是左上角坐標(biāo)。例如,一個覆蓋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()默認(rèn)使用NEAREST濾波器。如果要使用其他濾波器可以通過下面的方法來實現(xiàn):

2,Image模塊

  Image模塊是PIL中最重要的模塊,它有一個類叫做image,與模塊名稱相同。Image類有很多函數(shù),方法及屬性,接下來將依次對image類的屬性,函數(shù)和方法進(jìn)行介紹。

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類的新實例,這個實例對應(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á)式>)

說明:chr() 用一個范圍在 range(256)內(nèi)的(就是0~255)整數(shù)做參數(shù)。函數(shù)返回值類型為String,其數(shù)值表達(dá)式值取值范圍為0~255,返回一個對應(yīng)的字符(對應(yīng)的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)代碼,希望對大家有所幫助,如果大家有任何疑問歡迎給我留言,小編會及時回復(fù)大家的!


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論