侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

python web框架Flask实现图形验证码及验证码的动态刷新实例

Python  /  管理员 发布于 7年前   170

下列代码都是以自己的项目实例讲述的,相关的文本内容很少,主要说明全在代码注释中

自制图形验证码

这里所说的图形验证码都是自制的图形,通过画布、画笔、画笔字体的颜色绘制而成的。将验证码封装成一个类比较好管理,代码里有绝对详细的注释,当然大家可以直接复制。

里面涉及的字体都是从系统电脑上自带的,大家直接复制当前目录下就可以了。

主目录/utils/captcha/__init__.pyimport randomimport string# Image:一个画布# ImageDraw:一个画笔# ImageFont:画笔的字体from PIL import Image, ImageDraw, ImageFont# Captcha验证码class Captcha(object):  # 生成4位数的验证码  numbers = 4  # 验证码图片的宽度和高度  size = (100, 30)  # 验证码字体大小  fontsize = 25  # 加入干扰线的条数  line_number = 2  # 构建一个验证码源文本  SOURCE = list(string.ascii_letters)  for index in range(0, 10):    SOURCE.append(str(index))  # 用来绘制干扰线  @classmethod  def __gene_line(cls, draw, width, height):    begin = (random.randint(0, width), random.randint(0, height))    end = (random.randint(0, width), random.randint(0, height))    draw.line([begin, end], fill=cls.__gene_random_color(), width=2)  # 用来绘制干扰点  @classmethod  def __gene_points(cls, draw, point_chance, width, height):    # 大小限在【0, 100】中    chance = min(100, max(0, int(point_chance)))    for w in range(width):      for h in range(height):        tmp = random.randint(0, 100)        if tmp > 100 - chance:          draw.point((w, h), fill=cls.__gene_random_color())  # 生成随机颜色  @classmethod  def __gene_random_color(cls, start=0, end=255):    random.seed()    return (random.randint(start, end),        random.randint(start, end),        random.randint(start, end))  # 随机选择一个字体  @classmethod  def __gene_random_font(cls):    fonts = [      "PAPYRUS.TTF",      "CENTAUR.TTF",      "Inkfree.ttf",      "verdana.ttf",    ]    font = random.choice(fonts)    return "utils/captcha/"+font  # 用来随机生成一个字符串(包括英文和数字)  @classmethod  def gene_text(cls, numbers):    # numbers是生成验证码的位数    return " ".join(random.sample(cls.SOURCE, numbers))  # 生成验证码  @classmethod  def gene_graph_captcha(cls):    # 验证码图片的宽高    width, height = cls.size    # 创建图片    image = Image.new("RGBA", (width, height), cls.__gene_random_color(0, 100))    # 验证码的字体    font = ImageFont.truetype(cls.__gene_random_font(), cls.fontsize)    # 创建画笔    draw = ImageDraw.Draw(image)    # 生成字符串    text = cls.gene_text(cls.numbers)    # 获取字体的尺寸    font_width, font_height = font.getsize(text)    # 填充字符串    draw.text(((width-font_width)/2, (height-font_height)/2),         text, font=font, fill=cls.__gene_random_color(150, 255))    # 绘制干扰线    for x in range(0, cls.line_number):      cls.__gene_line(draw, width, height)    # 绘制干扰点    cls.__gene_points(draw, 10, width, height)    with open("captcha.png", "wb") as fp:      image.save(fp)    return text, image

显示图形验证码

一般图形验证码都是在表单中,这样短时间内的数据及建议保存在redis缓存中(用户点击动态刷新图形验证码)。首先我们绘制图形验证码保存到项目的目录下(入口文件是主目录(项目目录)app.py文件,图片也保存到主目录下),然后通过url地址访问自制的图形验证码(这里我只添加主要的代码)

主目录/common/[email protected]("/captcha")def graph_captcha():  """  使用定义好的图形验证码类,来制作验证码  以验证码为键、验证码为值(为了用户的体验,让其忽略大小写)存储在redis缓存中  通过BytesIO字节流的方式保存和访问图片  :return: 图片响应  """  # 获取验证码  text, image = Captcha.gene_graph_captcha()  cpcache.set(text.lower(), text.lower())  # BytesIO:字节流  out = BytesIO()  # 保存图片  image.save(out, "png")  # 存储完图片,将文件的指针指向文件头,使下次保存图片能覆盖前面保存的图片,节省空间  out.seek(0)  # 访问图片,并将其作为一个响应返回给前台  resp = make_response(out.read())  resp.content_type = "image/png"  return resp

前端页面的代码如下:

<div class="form-group">  <div class="input-group">    <input type="text" class="form-control" name="graph_captcha" placeholder="图形验证码">    <span class="input-group-addon captcha-addon">      <img id="captcha-img" class="captcha-img" src="https:/article/{{ url_for("common.graph_captcha") }}" alt="">    </span>  </div></div>

动态刷新验证码

无非就是再生成一张图形验证码,通过url再次访问就可以,但是这样做是非常麻烦的,这里我很难解释(很难!!!),大家就直接复制代码吧,这个代码就是点击图片生成一个新的url访问图片

这个文件放在公共的目录下就可以了var cpparam = {  setParam: function(href, key, value){    //重新加载整个页面    var isReplaced = false;    var urlArray = href.split("?");    if(urlArray.length > 1){      var queryArray = urlArray[1].split("&");      for(var i=0; i < queryArray.length; i++){        var paramArray = queryArray[i].split("=");        if(paramArray[0] == key){          paramArray[1] = value;          queryArray[i] = paramArray.join("=");          isReplaced = true;          break;        }      }      if(!isReplaced){        var params = {};        params[key] = value;        if(urlArray.length > 1){          href = href + "$" + $.param(params);        }else{          href = href + "?" + $.param(params);        }      }else{        var params = queryArray.join("&");        urlArray[1] = params;        href = urlArray.join("?");      }    }else{      var param = {};      param[key] = value;      if(urlArray.length > 1){        href = href + "$" + $.param(param);      }else{        href = href + "?" + $.param(param);      }    }    return href;  }};

对应html的js文件就需要实现元素(图片)点击刷新图片,调用上面的变量cpparam生成一章图片并访问。

$(function(){  $("#captcha-img").on("click", function(){    var self = $(this);    var src = self.attr("src");    var newsrc = cpparam.setParam(src, "xx", Math.random());    self.attr("src", newsrc);  });});

以上就是本次介绍的关于python web框架Flask实现图形验证码全部知识点内容,感谢大家的学习和的支持。


  • 上一条:
    Python 闭包,函数分隔作用域,nonlocal声明非局部变量操作示例
    下一条:
    解析Python3中的Import
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客