Python3 Flask框架 通過(guò)純后端方式實(shí)現(xiàn)簡(jiǎn)易驗(yàn)證碼

原文?https://www.cyberlight.xyz/passage/python3-flask-validate-picture

記錄純粹通過(guò)Python Flask生成并顯示驗(yàn)證碼唱捣,實(shí)現(xiàn)用戶驗(yàn)證登錄。實(shí)現(xiàn)過(guò)程中我參考了大量相關(guān)教程和筆記,感謝為之分享的各位实胸!

目前對(duì)此的理解不是很深刻黍瞧,先附上實(shí)現(xiàn)的過(guò)程

一.Flask后端

要實(shí)現(xiàn)驗(yàn)證碼辫继,需要用到PIL庫(kù)生成驗(yàn)證碼圖片 腊状,Python3輸入如下命令安裝

pip install pillow

下載ttf格式字體贝奇,放在程序根目錄航棱,然后用以下函數(shù)實(shí)現(xiàn)驗(yàn)證碼生成

from PIL import Image, ImageDraw, ImageFont, ImageFilter

from io import BytesIO

import random

import base64

#驗(yàn)證碼圖片

def validate_picture():

? ? total = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ012345789'

? ? # 圖片大小130 x 50

? ? width = 130

? ? heighth = 50

? ? # 先生成一個(gè)新圖片對(duì)象

? ? im = Image.new('RGB',(width, heighth), 'white')

? ? # 設(shè)置字體, MicrosoftYaqiHeiLight-2.ttf是我下載的字體睡雇,放在程序根目錄

? ? font = ImageFont.truetype("MicrosoftYaqiHeiLight-2.ttf", 30)

? ? # 創(chuàng)建draw對(duì)象

? ? draw = ImageDraw.Draw(im)

? ? str = ''

? ? # 輸出每一個(gè)文字

? ? for item in range(4):

? ? ? ? text = random.choice(total)

? ? ? ? str += text

? ? ? ? draw.text((-3+random.randint(3,7)+25*item, -3+random.randint(2,7)), text=text, fill='black',font=font )

? ? # 劃幾根干擾線

? ? for num in range(1):

? ? ? ? x1 = random.randint(0, width/2)

? ? ? ? y1 = random.randint(0, heighth/2)

? ? ? ? x2 = random.randint(0, width)

? ? ? ? y2 = random.randint(heighth/2, heighth)

? ? ? ? draw.line(((x1, y1),(x2,y2)), fill='black', width=1)

? ? # 加上濾鏡

? ? im = im.filter(ImageFilter.FIND_EDGES)

? ? return im, str

#生成驗(yàn)證碼實(shí)例的函數(shù)

def run_code():

? ? #生成驗(yàn)證碼,image為驗(yàn)證碼圖片饮醇,code為驗(yàn)證碼文本

? ? image, code = validate_picture()


? ? # 將驗(yàn)證碼圖片以二進(jìn)制形式寫(xiě)入在內(nèi)存中它抱,防止將圖片都放在文件夾中,占用大量磁盤(pán)

? ? buf = BytesIO()

? ? image.save(buf, 'jpeg')

? ? buf_str = buf.getvalue()



? ? data = str(base64.b64encode(buf_str))[1:].strip("'")? ? #將驗(yàn)證碼轉(zhuǎn)換為base64格式

? ? # session['code'] = code? #現(xiàn)在暫時(shí)未打開(kāi)朴艰,將驗(yàn)證碼文本存入session观蓄,做用戶登錄認(rèn)證時(shí)可用

? ? return data

完整的py程序?yàn)?/p>

from flask import Flask

from flask import render_template

from PIL import Image, ImageDraw, ImageFont, ImageFilter

from io import BytesIO

import random

import base64

#驗(yàn)證碼圖片

def validate_picture():

? ? total = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ012345789'

? ? # 圖片大小130 x 50

? ? width = 130

? ? heighth = 50

? ? # 先生成一個(gè)新圖片對(duì)象

? ? im = Image.new('RGB',(width, heighth), 'white')

? ? # 設(shè)置字體

? ? font = ImageFont.truetype("MicrosoftYaqiHeiLight-2.ttf", 30)

? ? # 創(chuàng)建draw對(duì)象

? ? draw = ImageDraw.Draw(im)

? ? str = ''

? ? # 輸出每一個(gè)文字

? ? for item in range(4):

? ? ? ? text = random.choice(total)

? ? ? ? str += text

? ? ? ? draw.text((-3+random.randint(3,7)+25*item, -3+random.randint(2,7)), text=text, fill='black',font=font )

? ? # 劃幾根干擾線

? ? for num in range(1):

? ? ? ? x1 = random.randint(0, width/2)

? ? ? ? y1 = random.randint(0, heighth/2)

? ? ? ? x2 = random.randint(0, width)

? ? ? ? y2 = random.randint(heighth/2, heighth)

? ? ? ? draw.line(((x1, y1),(x2,y2)), fill='black', width=1)

? ? # 加上濾鏡

? ? im = im.filter(ImageFilter.FIND_EDGES)

? ? return im, str

#生成驗(yàn)證碼實(shí)例的函數(shù)

def run_code():

? ? #生成驗(yàn)證碼,image為驗(yàn)證碼圖片祠墅,code為驗(yàn)證碼文本

? ? image, code = validate_picture()


? ? # 將驗(yàn)證碼圖片以二進(jìn)制形式寫(xiě)入在內(nèi)存中侮穿,防止將圖片都放在文件夾中,占用大量磁盤(pán)

? ? buf = BytesIO()

? ? image.save(buf, 'jpeg')

? ? buf_str = buf.getvalue()



? ? data = str(base64.b64encode(buf_str))[1:].strip("'")? ? #將驗(yàn)證碼轉(zhuǎn)換為base64格式

? ? # session['code'] = code? #將驗(yàn)證碼文本存入session毁嗦,做用戶登錄認(rèn)證時(shí)可用

? ? return data

app = Flask(__name__)

@app.route('/')

def test():

? ? data = run_code()? #生成新驗(yàn)證碼?

? ? return render_template('test.html', img_stream = data) #會(huì)在下面貼出我的html源碼?

if __name__ == '__main__':

? ? ? ? app.run(host='0.0.0.0', debug=True)

二.HTML模板

Flask中創(chuàng)建如下html模板亲茅,放在 程序根目錄/templates 中

<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8">

</head>

<body>

<font size="8em">

<!-- 驗(yàn)證碼顯示區(qū)域,驗(yàn)證碼以二進(jìn)制輸出到前端-->

<p class="center"><img width:"200px" src="data:;base64,{{ img_stream }}"> </p>

</font>

</body>

</html>

之后運(yùn)行Python,打開(kāi)瀏覽器輸入地址克锣,便能成功顯示驗(yàn)證碼了茵肃,每次刷新自動(dòng)生成哦

如果您有更好的方法,歡迎留言哦

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末袭祟,一起剝皮案震驚了整個(gè)濱河市验残,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌巾乳,老刑警劉巖您没,帶你破解...
    沈念sama閱讀 211,639評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異胆绊,居然都是意外死亡氨鹏,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)辑舷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)喻犁,“玉大人,你說(shuō)我怎么就攤上這事何缓≈。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,221評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵碌廓,是天一觀的道長(zhǎng)传轰。 經(jīng)常有香客問(wèn)我,道長(zhǎng)谷婆,這世上最難降的妖魔是什么慨蛙? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,474評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮纪挎,結(jié)果婚禮上期贫,老公的妹妹穿的比我還像新娘。我一直安慰自己异袄,他們只是感情好通砍,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著烤蜕,像睡著了一般封孙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上讽营,一...
    開(kāi)封第一講書(shū)人閱讀 49,816評(píng)論 1 290
  • 那天虎忌,我揣著相機(jī)與錄音,去河邊找鬼橱鹏。 笑死膜蠢,一個(gè)胖子當(dāng)著我的面吹牛堪藐,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播挑围,決...
    沈念sama閱讀 38,957評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼庶橱,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了贪惹?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,718評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤寂嘉,失蹤者是張志新(化名)和其女友劉穎奏瞬,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體泉孩,經(jīng)...
    沈念sama閱讀 44,176評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡硼端,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了寓搬。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片珍昨。...
    茶點(diǎn)故事閱讀 38,646評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖句喷,靈堂內(nèi)的尸體忽然破棺而出镣典,到底是詐尸還是另有隱情,我是刑警寧澤唾琼,帶...
    沈念sama閱讀 34,322評(píng)論 4 330
  • 正文 年R本政府宣布兄春,位于F島的核電站,受9級(jí)特大地震影響锡溯,放射性物質(zhì)發(fā)生泄漏赶舆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評(píng)論 3 313
  • 文/蒙蒙 一祭饭、第九天 我趴在偏房一處隱蔽的房頂上張望芜茵。 院中可真熱鬧,春花似錦倡蝙、人聲如沸九串。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,755評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蒸辆。三九已至,卻和暖如春析既,著一層夾襖步出監(jiān)牢的瞬間躬贡,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,987評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工眼坏, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拂玻,地道東北人酸些。 一個(gè)月前我還...
    沈念sama閱讀 46,358評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像檐蚜,于是被迫代替她去往敵國(guó)和親魄懂。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容