提高安全性
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('验证失败')