---恢复内容开始---

import random
import string
# Image:一个画布
# ImageDraw:一个画笔
# ImageFont:画笔的字体

# pip install pillow
from PIL import Image, ImageDraw, ImageFont

class Captcha(object):
    # 生成几位数的验证码
    number =
    # 验证码图片的高度和宽度
    size = (, )
    # 验证码字体大小
    fontsize =
    # 加入干扰线条数
    line_number = 

    # 构建一个验证码源文本
    SOURCE = list(string.ascii_letters)
    , ):
        SOURCE.append(str(index))

    # 用来绘制干扰线
    @classmethod
    def __gene_line(cls, draw, width, height):
        begin = (random.randint(, width), random.randint(, height))
        end = (random.randint(, width), random.randint(, height))
        draw.line([begin, end], fill=cls.__gene_random_color(), width=)

    # 用来绘制干扰点
    @classmethod
    def __gene_points(cls, draw, point_chance, width, height):
        chance = min(, max(, , ]
        for w in range(width):
            for h in range(height):
                tmp = random.randint(, )
                 - chance:
                    draw.point((w, h), fill=cls.__gene_random_color())

    # 生成随机的颜色
    @classmethod
    def __gene_random_color(cls, start=, end=):
        random.seed()
        return (random.randint(start, end), random.randint(start, end), random.randint(start, end))

    # 随机选择一个字体
    @classmethod
    def __gene_random_font(cls):
        fonts = [

            'Lobster-Regular.ttf',
            'verdana.ttf'
        ]
        font = random.choice(fonts)
        return font

    # 用来随机生成一个字符串
    @classmethod
    def gene_text(cls, number):
        # num是生成验证码的位数
        return ''.join(random.sample(cls.SOURCE, number))

    # 生成验证码
    @classmethod
    def gene_graph_captcha(cls):
        # 验证码图片的高和宽
        width, height = cls.size
        # 创建图片
        image = Image., ))
        # 验证码的字体
        font = ImageFont.truetype(cls.__gene_random_font(), cls.fontsize)
        # font = ImageFont.truetype(cls.__gene_random_font(), cls.fontsize)
        # 创建画笔
        draw = ImageDraw.Draw(image)
        # 生成字符串
        text = cls.gene_text(cls.number)
        # 获取字体尺寸
        font_width, font_height = font.getsize(text)
        # 填充字符串
        draw.text(((width - font_width) / , (height - font_height) / ), text, font=font,
                  fill=cls.__gene_random_color(, ))
        # 绘制干扰线
        , cls.line_number):
            cls.__gene_line(draw, width, height)
        # 绘制噪点
        cls.__gene_points(draw, , width, height)
        return (text, image)

from flask import make_response
from flask import Flaskfrom io import BytesIO
from flask import render_template

app = Flask(__name__)

@app.route('/')
def index():
    return render_template('login.html')

@app.route('/ver_image_code')
def graph_captcha():
    text, image = Captcha.gene_graph_captcha()
    out = BytesIO()
    image.save(out, 'png')
    )
    resp = make_response(out.read())
    resp.content_type = 'image/png'
return resp

if __name__ == '__main__':
    app.run()

---恢复内容结束---

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>Title</title>    <style>        <!--        样式-- >        .captcha-addon {            padding: 0;            /*/ / 这是内边距为0,因为input-group-addon有设置内边距 overflow: hidden;*/            /*/ / 当里面的元素超出则隐藏*/        }

        #captcha-img {            height: 32px;            /*/ / 设置图片的高度为32px cursor: pointer;*/            /*/ / 当鼠标移到图片上变成手的图标*/        }    </style></head><body><div class="input-group">    <input type="text" class="form-control" name="graph_captcha" placeholder="图形验证码">    <span class="input-group-addon captcha-addon"> <!--加了一个类captcha-addon-->                 <img id="captcha-img" name="captcha-img" src="/ver_image_code/1" onclick="get_src()">        <!--加了id aptcha-img-->    </span></div>

<script src="{{ url_for('static', filename='jquery-3.3.1.js') }}"></script><script type="text/javascript">

    function get_src() {        var img = document.getElementById("captcha-img");        img.src = "http://127.0.0.1:5000/ver_image_code/" + Math.random();    }

</script></body></html>

Flask 验证码 点击验证码刷新的更多相关文章

  1. 微信小程序发送验证码功能,验证码倒计时

    data{ timer:'', countDownNum:'发送验证码', } // 点击验证码倒计时获取验证码 Gain:function(e){ let that = this let count ...

  2. 关于 yii 验证码显示, 但点击不能刷新的处理

    先说说 render 与 renderPartial, 各位看官, 先别走, 我没跑题, 这个问题如果需要解决, 关键就在 render 与 renderPartial 的区别. renderPart ...

  3. thinkPHP5.0框架验证码调用及点击图片刷新简单实现方法

    这篇文章主要介绍了thinkPHP5.0框架验证码调用及点击图片刷新简单实现方法,结合简单示例形式分析了thinkPHP5框架验证码相关配置.后台验证.前台刷新等操作技巧,学习thinkphp源码的朋 ...

  4. JS 点击验证码刷新

    <img src="/get_valid_img" id="valid-img" title="点击再换一张" class=" ...

  5. clicaptcha中文点击验证码开发经验总结

    现在的验证码真是越来越高级了,12306 的找图验证码,极验的拖动式验证码,还有国外的一些黑科技,能智能判断你是不是机器人的验证码. 验证码的更新迭代让我突然对传统验证码一下子不满足了,出于挑战自我和 ...

  6. thinkphp3.2 代码生成并点击验证码

    本人小菜鸟一仅仅.为了自我学习和交流PHP(jquery,linux,lamp,shell,javascript,server)等一系列的知识.小菜鸟创建了一个群.希望光临本博客的人能够进来交流.寻求 ...

  7. WPF做12306验证码点击效果

    一.效果 和12306是一样的,运行一张图上点击多个位置,横线以上和左边框还有有边框位置不允许点击,点击按钮输出坐标集合,也就是12306登陆的时候,需要向后台传递的参数. 二.实现思路 1.获取验证 ...

  8. 用JAVA中BufferedImage画出漂亮的验证码点击变化

    如果我们想用JAVA中BufferedImage画出漂亮的验证码点击变化怎么实现呢,类似这样: 点击变化,以下是实现过程,直接上代码: 首先前台:<i><img style=&quo ...

  9. 验证码在后台的编写,并实现点击验证码图片时时发生更新 C# 项目发布到IIS后不能用log4net写日志

    验证码在后台的编写,并实现点击验证码图片时时发生更新   验证码在软件中的地位越来越重要,有效防止这种问题对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试:下面就是实现验证码的基本步骤: ...

随机推荐

  1. idea springboot 父子工程 子工程maven不自动import

    父工程删除对spring boot启动项的引用,因为父工程 dependencyManagement,它不会自动加载包,只指定包的版本, 如果在父工程中引用了包,但是没有指定包版本,子工程将不会识别到 ...

  2. centos设置路由route

    一. route命令                        1) 查看:route -n      2)添加: route add  [-net|-host]  target [netmask ...

  3. 利用JAVA API函数实现数据的压缩与解压缩

      综述 许多信息资料都或多或少的包含一些多余的数据.通常会导致在客户端与服务器之间,应用程序与计算机之间极大的数据传输量.最常见的解决数据存储和信息传送的方法是安装额外的存储设备和扩展现有的通讯能力 ...

  4. java 日志脱敏框架 sensitive-新版本0.0.2-深度拷贝,属性为对象和集合的支持

    项目介绍 日志脱敏是常见的安全需求.普通的基于工具类方法的方式,对代码的入侵性太强.编写起来又特别麻烦. 本项目提供基于注解的方式,并且内置了常见的脱敏方式,便于开发. 用户也可以基于自己的实际需要, ...

  5. centos7 配置lamp 环境

    搭建版本 版本组合 php5.6+apache/2.4.6(centos7)+mysql5.7.24 因为新系统不能确认哪些指令已经搭建  所以安装前需要确认下是否拥有 检测是否已经安装过Vim rp ...

  6. (Python基础)字符编码与转码

    ASCII(American Standard Code for Information Interchange,美国标准信息交换代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧 ...

  7. (11)ssh免密登录配置

    ***在Linux命令行中登录到另一台虚拟机(需要用到ssh协议) Linux中默认有ssh的服务器端和客户端,客户端的名字就叫ssh 前提是当前使用的用户名在待连接的虚拟机中存在 格式:  ssh ...

  8. tornado架构分析2 options.py实现原理

    总结体会: options这个文件是用来管理程序运行过程中配置的,它采用了单例模式,整个程序运行时只有一个实例存在. 参数可以从命令行读取,也可以从配置文件中读取,就看你怎么用了. 同时,option ...

  9. Intellij IDEA常用快捷键介绍 Intellij IDEA快捷键大全汇总

    其他的快捷键还有很多,象Ctrl+G(跳转到指定行).Ctrl+F4(关闭当前编辑页面).Ctrl+F(搜索)等等,这些快捷键由于是各个编辑器都会提供的,而且定义的键位也都差不多,就没什么可说的了: ...

  10. [Linux]CentOS与终端破墙

    来源:https://www.zybuluo.com/ncepuwanghui/note/954160 参考:https://blog.huihut.com/2017/08/25/LinuxInsta ...