1. 程式人生 > >Django中的驗證碼

Django中的驗證碼

提高安全性

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('驗證失敗')