正如日常生活中所见,网站、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