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

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. HashTable源码简单介绍

    首先是继承了字典类Dictionary, 这说明HashTable的一些找位置的实现与Dictionary有关, 看一看数据结构,是一个entry数组, Entry,这个不陌生,先看一下它的结构吧,这 ...

  2. 有什么学习MySQL的好教程吗?

      有什么学习Mysql的好教程吗? 文档是最好的,现整理如下: [mysql教程]MySQL 教程 [MySQL教程]MySQL 安装 [MySQL教程]MySQL 管理 [MySQL教程]MySQ ...

  3. omniPlan密匙

    密钥所有者都是youliyuan.OmniPlan 3:HOMJ-QOJH-OIBN-TNIH-HWUN-TEEH-WUNNKWO-HVKB-JAZE-UIHH-XAVY-BEEX-AVYBCRW-M ...

  4. 【学习】数据规整化:清理、转换、合并、重塑(续)【pandas】

    @合并重叠数据 还有一种数据组合问题不能用简单的合并或连接运算来处理.比如说,你可能有索引全部或部分重叠的两个数据集 使用numpy的where函数,它用于表达一种矢量化的if - else a = ...

  5. hdfs webhdfs 写文件(create file)

    # _*_ coding=utf-8 _*_ import sys import os hosts = {} cmd1 = ''' curl -i -X PUT "http://%s:500 ...

  6. SQL SERVER 2019新功能

    1.错误代码行 BEGIN TRY    SELECT 1/0END TRYBEGIN CATCH    THROW END CATCH2.二级制截断列名值 chose语法

  7. 干货!微信自动跳转默认浏览器下载app的方法!

    现在微信渠道可以说是拉新最快的渠道,因为微信具备强裂变性.但是目前微信对第三方下载链接的拦截是越来越严格了,那么想要在微信内肆无忌惮地推广链接就需要用到微信跳转浏览器的接口,那如何获取该接口呢?   ...

  8. activiti官网实例项目activiti-explorer之扩展流程节点属性2

    情景需求:需要查找activiti-explorer项目中获取流程id的方法,然后根据流程id获取相应字段在节点属性中添加内容. 大致流程:拿取整个流程id获取对应表单属性,在页面节点属性中展示对应表 ...

  9. P1219 八皇后

    题目描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子. 上面的布局可以用序列2 4 6 1 3 ...

  10. Navicat Premium 12激活教程

    Navicat Premium 12激活教程 1.软件包的下载 百度云地址链接: 注册机:https://pan.baidu.com/s/1KzmCbVYcVoXt_t4osXk3Kw  提取码: q ...