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('验证失败')

猜你喜欢

转载自blog.csdn.net/EverXerxes/article/details/82762733