python动态验证码_WEB开发-动态验证码

1.基于Python实现,用到了django后台处理,刷新验证码功能,其他语言大同小异

2.登录界面

login.html

DevOPS v1.0

var src_re= $(ths).attr('src');

$(ths).attr('src', src_re + '?');

}

里面涉及到2个后端视图函数login和get_yanzhengma

3.后端视图函数

helper.py

#-*- coding=utf-8 -*-

importrandom#随机字母:

defrndChar():return chr(random.randint(65, 90)) + chr(random.randint(65, 90)) + chr(random.randint(65, 90)) + chr(random.randint(65, 90))

Django的views.py

#-*- coding=utf-8 -*-##############################

from django.shortcuts importrender, HttpResponse, render_to_response,redirectfrom app importmodelsfrom helper importrndCharfrom PIL importImage, ImageFont, ImageDrawimportio#Create your views here.

defindex(request):#return HttpResponse('123456')

return render_to_response('app/pages/index.html')deflogin(request):if request.method == 'POST':printrequest.POST

username= request.POST.get('username',None)

password= request.POST.get('password',None)

yanzhengma= request.POST.get('yanzhengma',None)#print yanzhengma,request.session['yanzhengma']

if yanzhengma.upper() != request.session['yanzhengma'].upper():return render_to_response('app/pages/login.html',{'msg':'验证码错误'})

count= models.AdminInfo.objects.filter(username=username,password=password).count()if count >0:

request.session['is_login'] = {'user':username}return redirect('/index/')#return render_to_response('app/pages/index.html')

else:return render_to_response('app/pages/login.html',{'msg':'账户密码错误'})else:#print stream.getvalue()

#im.save("static/image/t.png")

#request.session['yanzhengma'] = text

return render_to_response('app/pages/login.html',{'msg':''})defyanzhengma(request):#text为产生的4位随机字符串

text =rndChar()#print text

request.session['yanzhengma'] =text#图片处理程序,将文本做成图片

im = Image.new("RGB", (130, 35), (255, 255, 255))

dr=ImageDraw.Draw(im)

font= ImageFont.truetype("arial", 24)#simsunb.ttf 这个从windows fonts copy一个过来

dr.text((10, 5), text, font=font, fill="#000000")#im.show()

#创建一个io对象

stream =io.BytesIO()#将图片对象im保存到stream对象里

im.save(stream, "png")#stream.getvalue()图片二级制内容,再通过HttpResponse封装,返回给前端页面

return HttpResponse(stream.getvalue())

4.效果图展示

5.备注:

(1)img标签的src属性,去这个/get_yanzhengma/去取图片

(2)get_yanzhengma函数执行

(3)通过random模块生成随机码,4个字母

(4)通过PIL模块将随机数字转换为图片对象im

(5)创建一个BytesIO对象,内存对象,可以存储二进制的东西

(6)将图片对象保存到BytesIO对象中,此处在内存里

#话说为什么要将图片对象保存到BytesIO对象中而不是直接写到硬盘里存为图片文件呢?因为这样就保证了在同一个时刻,不同用户访问到的验证码是不一样的,而且都是存储在内存中的。

#如果写成验证码图片文件到硬盘里,有可能B页面显示的验证码是ABCD,但是B用户还没提交,A用户这会访问,刷新了验证码,把验证码变更为DCBA了,B页面里看到的还是ABCD,导致一直输不对验证码;无法保证2个用户的验证码图片冲突问题

#后端验证码的随机值是存储在session中的,每次用户GET请求,服务器上生成随机验证码存储在session中,并给页面返回,如果用户提交的验证码和后端session中记录的一致通过,如果不一致,重新刷新验证码,用户重新进行提交

(7)BytesIO对象的getvalue()方法返回二进制内容

(8)django提供的HttpResponse封装二进制内容为识别的东西传递给前端

(7)前端img标签正常显示图片

(9)用户点击图片,js先获取到这个图片标签,取到当前的src属性值存为变量src_re,然后更改src的属性值为src_re + ?

#为什么要加?呢是因为GET请求,每最后加一个?代表一个新的url,但是效果呢是和/index/yanzhengma/是一致的,每点一次,后面加一个?。/index/yanzhengma/?    /index/yanzhengma/??这个意思

#如果每次只更改src的属性值为/index/yanzhengma/的话,不会进行request请求,会直接浏览器缓存读取。达不到刷新验证码的目的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值