Django中的验证码

本文介绍了Django中实现验证码的步骤,包括使用pillow模块处理验证码图片,绘制验证码,实现验证码刷新功能以及详细阐述了验证码的验证过程,涉及到session的使用。
摘要由CSDN通过智能技术生成
提高安全性

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('验证失败')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值