Django中的驗證碼
阿新 • • 發佈:2018-11-06
提高安全性
1、特點
1、時效性
2、隨機性
3、安全
4、越模糊越安全
2、使用
1、安裝pillow模組來處理
pip install pillow
2、畫驗證碼
def getVerificationCode(request): # 建立一個畫布 # mode 畫布模式 'rgb' # size 畫布的寬高 image = Image.new('RGB',(200,70),createColor()) # 建立一個畫筆 # 引數1是繫結的畫布 # 引數2是模式 imageDraw = ImageDraw.Draw(image,'RGB') # 設定字型 imageFont = ImageFont.truetype("static/font/ADOBEARABIC-BOLD.OTF",size=50) # 畫 # xy 畫的起始位置(座標) # text 畫的內容 # fill = None, # font = None, # imageDraw.text((5,10),'mahua',fill=(255,0,0),font=imageFont) # 使字母數字不同顏色 #隨機生成一個字母數字,隨機4次 charSource = 'qwertyuiopasdfghjklzxcvnmQWERTYUIPASDFGHJKLZXCVBNM1234567890' verCode = '' for i in range(4): ch = random.choice(charSource) imageDraw.text((20+i*50,3),ch,fill=createColor(),font=imageFont) verCode += ch # 伺服器保留一份驗證碼 request.session['verCode'] = verCode request.session.set_expiry(20) # 畫點 for i in range(2000): x = random.randint(0,200) y = random.randint(0,70) imageDraw.point((x,y),fill=createColor()) # 建立一個位元組流 import io byteIO = io.BytesIO() # 把圖片儲存到位元組流中 image.save(byteIO,'png') return HttpResponse(byteIO.getvalue(),'image/png') def createColor(): red = random.randint(0,255) green = random.randint(0,255) blue = random.randint(0,255) return (red,green,blue)
3、驗證碼功能
點選重新整理
1、給驗證圖片設定點選事件
2、每點選一次重新請求一次
3、注意:因為我們每次重新整理做的是同樣的請求,瀏覽器會認為請求的是同一個內容,會自動的使用上一次的內容(快取),導致驗證碼不能重新整理
解決:使得每次請求url都發生變化
如:
$(function () {
// 設定點選事件
$("#verificationCode").click(function () {
$(this).attr("src","/day07/getVerificationCode"+Math.random())
})
})
4、驗證碼驗證
即在請求驗證碼的時候保留一個驗證碼,使用者提交的時候會提交一個驗證碼,如果兩個驗證碼一致則匹配成功
1、請求驗證碼的時候保留驗證碼到session
# 伺服器儲存一份驗證碼
request.session['verCode'] = verCode
# 加一個驗證碼過期時間
request.session.set_expiry(20)
2、提交的時候驗證驗證碼
def dologin(request): # 獲取使用者輸入的驗證碼 verCode1 = request.GET.get('verCode') # 與伺服器儲存的驗證碼對比 verCode2 = request.session.get('verCode') # 判斷 為空時驗證失敗 if (verCode1=="") or (not verCode2): return HttpResponse('驗證失敗') elif verCode1.lower()==verCode2.lower(): # 匹配成功,成功登陸 return HttpResponse('驗證成功') else: return HttpResponse('驗證失敗')