python3 简单验证码的实现

视图

views.py

#验证码
def verify_code(request):
  #引入随机函数模块
  import random
  #定义变量,用于画面的背景色、宽、高
  bgcolor = (random.randrange(20, 100), random.randrange(20, 100), 255)
  width = 100
  height = 25
  #创建画面对象
  im = Image.new('RGB', (width, height), bgcolor)
  #创建画笔对象
  draw = ImageDraw.Draw(im)
  #调用画笔的point()函数绘制噪点
  for i in range(0, 100):
  xy = (random.randrange(0, width), random.randrange(0, height))
  fill = (random.randrange(0, 255), 255, random.randrange(0, 255))
  draw.point(xy, fill=fill)
  #定义验证码的备选值
  str1 = 'ABCD123EFGHIJK456LMNOPQRS789TUVWXYZ0'
  #随机选取4个值作为验证码
  rand_str = ''
  for i in range(0, 4):
  rand_str += str1[random.randrange(0, len(str1))]
  #构造字体对象,ubuntu的字体路径为“/usr/share/fonts/truetype/freefont”
  font = ImageFont.truetype('FreeMono.ttf', 23)
  #构造字体颜色
  fontcolor = (255, random.randrange(0, 255), random.randrange(0, 255))
  #绘制4个字
  draw.text((5, 2), rand_str[0], font=font, fill=fontcolor)
  draw.text((25, 2), rand_str[1], font=font, fill=fontcolor)
  draw.text((50, 2), rand_str[2], font=font, fill=fontcolor)
  draw.text((75, 2), rand_str[3], font=font, fill=fontcolor)
  #释放画笔
  del draw
  #存入session,用于做进一步验证
  request.session['verifycode'] = rand_str

  #内存文件操作(python2)
  #import cStringIO
  #buf = cStringIO.StringIO()

  #内存文件操作(python3)
  from io import BytesIO
  buf = BytesIO()

  #将图片保存在内存中,文件类型为png
  im.save(buf, 'png')
  #将内存中的图片数据返回给客户端,MIME类型为图片png
  return HttpResponse(buf.getvalue(), 'image/png')

#调用验证码
def verify_show(request):
  return render(request,'verify_show.html')

模板

templates (html)

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>验证码</title>
<script src="/static/js/jquery-1.12.4.min.js"></script>
<script>
$(function () {
  // 添加点击事件 鼠标浮动时变成小手
  $('#change').css('cursor','pointer').click(function () {
    // 获取到图片的src路径 换一个新的路径 此代码相当与在原来的基础上增加数据
    $('#yzm').attr('src',$('#yzm').attr('src')+'?1')
  })
})
</script>
</head>
<body>
  <form method="post" action="{% url 'booktest:verify_yz' %}">
  {%csrf_token%}
  <input type="text" name="yzm">
  <img id="yzm" src="{% url 'booktest:verify_code' %}"/>
  {# 这种方法是整个页面刷新 不好用#}
  {# <span id="change"><a href="/booktest/verify_show" style="text-decoration:none">看不清楚,换一个</a></span>#}
  <span id="change">看不清,换一个</span>
  <br>
  <input type="submit" value="提交">
</form>
</body>
</html>

验证

def verify_yz(request):
  yzm = request.POST.get('yzm')
  verifycode = request.session['verifycode']
  response = HttpResponse('NO------------------------')
  if yzm == verifycode:
  response = HttpResponse('OK-------------------------------')
  return response

posted @ 2020-09-20 17:36  Py_beginner  阅读(269)  评论(0编辑  收藏  举报