Python生成验证码图片及验证用户提交的验证码是否正确

        正如日常生活中所见,网站、APP一般都需要用户进行注册登录,获取用户登录信息,登录页面除了需要输入正确的用户名和密码,往往还需要对验证码进行验证,验证码有图片验证码、文字验证码、数字验证码等,触发方式有输入的、移动的、点击的、滑动的层出不穷。只有用户名、密码以及验证码偶都输入正确,才能成功登录。

        那如何随机生成不同的验证码图片以及如何验证用户输入的验证码是否正确,具体步骤如下图:

一、流程图:

                                                      

二、登录界面:

 

                        

三、代码实践:

 

# -*- coding: UTF-8 -*-
"""
@author:ZSW
@file:index.py
@time:2020/12/18
"""

from flask import Flask
from flask_cors import *
from Generate_image_verify_code.get_captcha import get_captcha
import json

app = Flask(__name__)
CORS(app, supports_credentials=True)
app.secret_key = 'A0Zr98j/3yX R~XggHhH!jmN]LWX/,?RT'


# 获取验证码图片
@app.route('/index', methods=['GET'])
def get_captchainfo():
    res = get_captcha().generate_verify_code()
    return json.dumps(res, ensure_ascii=False, indent=4)


# 对用户输入的验证码进行验证
@app.route('/verify', methods=['POST'])
def get_verify():
    res = get_captcha().get_verify_info()
    return json.dumps(res, ensure_ascii=False, indent=4)


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5058, threaded=True)
# -*- coding: UTF-8 -*-
"""
@author:ZSW
@file:get_captcha.py
@time:2020/12/18
"""
from flask import session, request
from Generate_image_verify_code.captcha_handle import create_captcha
from io import BytesIO
import base64


# 视图,生成验证码图片和code,返回图片,code存进session
class get_captcha():
    def generate_verify_code(self):
        # 生成验证码图片和验证码code,返回验证码图片,并以形式将验证码存放在session里
        try:
            f = BytesIO()
            img, code = create_captcha()  # 获取验证码图片 和 验证码
            session['code'] = code  # 将 code保存到session中
            # print(session['code'])
            img.save(f, 'PNG')
            # print(f.getvalue())  # 将图片转为二进制流
            img_stream = base64.b64encode(f.getvalue())  # 转为base64编码
            img_stream = 'data:image/jpeg;base64,%s' % str(img_stream, encoding="utf-8")
            return {'code': 1, 'message': '数据获取成功', 'data': img_stream}
        except Exception as e:
            return {'code': 0, 'message': '返回验证码图片错误', 'reason': e}

    # 对用户输入的验证码进行验证
    def get_verify_info(self):
        try:
            post_data = request.json
            verify_code = post_data.get('verify_code')
            if session['code'] == verify_code:
                return {'code': 1, 'message': '验证码输入正确'}
            else:
                return {'code': 0, 'message': '验证码输入错误'}
        except Exception as e:
            return {'code': 0, 'message': '验证失败', 'reason': e}

获取验证码图片和验证码:

# -*- coding: UTF-8 -*-
"""
@author:ZSW
@file:captcha_handle.py
@time:2020/12/18
"""

import random, string
from PIL import Image, ImageDraw, ImageFont, ImageFilter


# 生成随机字符串
def _getRandomChar():
    # string模块包含各种字符串,以下为小写字母加数字
    ran = string.ascii_lowercase+string.digits
    char = ''
    for i in range(4):
        char += random.choice(ran)
    return char


# 返回一个随机的RGB颜色
def _getRandomColor():
    return (random.randint(50,150), random.randint(50,150),random.randint(50,150))


def create_captcha():
    # 创建图片,模式,大小,背景色
    img = Image.new('RGB', (120, 30), (255, 255, 255))
    # 创建画布
    draw = ImageDraw.Draw(img)
    # 设置字体
    font = ImageFont.truetype('D:\Fonts\msyhbd.ttf', 25)

    code = _getRandomChar()
    # 将生成的字符画在画布上
    for t in range(4):
        draw.text((30*t+5, 0), code[t], _getRandomColor(), font)

    # 生成干扰点
    for _ in range(random.randint(50, 80)):
        # 位置,颜色
        draw.point((random.randint(0, 120), random.randint(0, 30)), fill=_getRandomColor())

    # 使用模糊滤镜使图片模糊
    # img = img.filter(ImageFilter.BLUR)
    # 保存
    # img.save('./picture/'+''.join(code)+'.jpg', 'jpeg')
    return img, code

 

四、验证测试:

首先获取验证码图片,同时验证码内容已保存至session中:

 

可以将base64编码转为图片看看验证码:https://oktools.net/image2base64

如图验证码为cdov。

 

接着,访问对用户输入的验证码进行验证接口:如果用户输入的为:cdov,则验证码输入成功

 

{
    "verify_code":"cdov"
}

用户输入的为:cd0v,则验证码输入错误

{
    "verify_code":"cd0v"
}

如果重新获取验证码图片,则循环执行上述步骤。

 

参考链接:http://www.calmkart.com/?p=332

 

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Steven灬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值