首页 > 代码库 > WEB开发-动态验证码

WEB开发-动态验证码

1.基于Python编程语言实现,其他语言大同小异


 

2.登录界面login.html

1 <form action=‘/login/‘>2     <input type=‘text‘ name=‘username‘ />3     <input type=‘password‘ name=‘password‘ />4     <input type=‘text‘ name=‘yanzhengma‘ />5     <img src="/get_yanzhengma/" onclick="ChangeYanzhengma();"></img>6     <input type=‘submit‘ name=‘登录‘ />7 </form>

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


 

3.后端视图函数

 1 #-*- coding=utf-8 -*- 2 from PIL import Image,ImageDraw,ImageFont 3  4 def login(request): 5     return render_to_response(login.html) 6      7      8 def yanzhengma(request): 9     #text为产生的4位随机字符串10     text = rndChar()11     #图片处理程序,将文本做成图片12     im = Image.new("RGB", (130, 35), (255, 255, 255))13     dr = ImageDraw.Draw(im)14     font = ImageFont.truetype("arial.tff", 24)15     # arial.tff 这个从windows fonts copy一个过来16     dr.text((10, 5), text, font=font, fill="#000000")17     # im.show()18     #创建一个io对象19     stream = io.BytesIO()20     #将图片对象im保存到stream对象里21     im.save(stream, "png")22     #stream.getvalue()图片二级制内容,再通过HttpResponse封装,返回给前端页面23     return HttpResponse(stream.getvalue())

4.备注:

(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中记录的一致通过,如果不一致,重新刷新验证码,用户重新进行提交

#用户点击验证码图片刷新功能,暂未实现;用户点击验证码图片,ajax流程-后端服务器去重新生成验证码,session变更,重新传递给前端,验证码图片变更

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

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

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

WEB开发-动态验证码