flask7 图形验证码

app

from flask import Flask
from flask_script import Manager
from App.views import bp

app = Flask(__name__)
app.config.from_pyfile("settings.py")
manager = Manager(app)
# 注册蓝图
app.register_blueprint(bp)

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

settings

from datetime import timedelta

# # 签名加密,session使用
SECRET_KEY = "i9490kl*(780990HGjhsoid7872378287mn,,.,ghghY!@3"
# # session存活时间
PERMANENT_SESSION_LIFETIME = timedelta(days=3)
# # session是否持久存储
PERMANENT = True

App.views

from flask import Blueprint,session, make_response,request,render_template,redirect

from App.forms import RegisterForm
from App.verifycode import  vc

bp = Blueprint("bp",__name__)

@bp.route("/verify/")
def verify_code():
    result = vc.generate()
    # 把验证码字符串保存到session
    session['code'] = vc.code
    # 创建响应对象
    response = make_response(result)
    response.headers["Content-Type"] = "image/png"
    return response

# 用户注册
@bp.route("/register/",methods=['GET','POST'])
def register_user():
    form = RegisterForm()
    if request.method == 'POST':
        if form.validate_on_submit():
            print(form)
            return redirect('/verify')
    return render_template("register.html",**locals())

App.verifycode

import os
from io import BytesIO
from random import randint

from PIL import Image,ImageFont,ImageDraw

class VerifyCode:
    def __init__(self,width=100,height=40,size=4):
        """
        :param width: 验证码图片宽度
        :param height: 高度
        :param size: 字符数
        """
        self.width = width
        self.height = height
        self.size = size
        self.__code = '' # 验证码字符串
        self.pen = None  # 画笔
    @property
    def code(self):
        return self.__code

    def generate(self):
        # 1)、创建画布
        im = Image.new("RGB",(self.width,self.height),self.__rand_color(150))
        self.pen = ImageDraw.Draw(im)
        # 2)、生成验证码字符串
        self.rand_string()
        # 3)、画验证码
        self.__draw_code()
        # 4)、画干扰点
        self.__draw_point()
        # 5)、画干扰线
        self.__rand_line()
        # 6)、返回验证码图片
        # 缓冲区
        buf = BytesIO()
        # 把图片放到缓冲区
        im.save(buf,'png')
        # 获取图片的二进制
        res = buf.getvalue()
        buf.close()
        return res
        # im.save("vc.png")

    def __rand_color(self,min=0,max=255):
        return randint(min,max),randint(min,max),randint(min,max)

    # 验证码字符串
    def rand_string(self):
        self.__code = ''
        for i in range(self.size):
            self.__code += str(randint(0,9))

    #画验证码
    def __draw_code(self):
        # 加载字体
        path = os.path.join(os.getcwd(),'static/fonts/SIMLI.TTF')
        print(path)
        font1 = ImageFont.truetype(path,size=20,encoding="utf-8")

        # 计算字符宽度
        width = (self.width-20) // self.size

        # 逐个字符画
        for i in range(len(self.__code)):
            x = 13 + width * i  # 计算每个字符的x坐标
            self.pen.text((x,9),self.__code[i],font=font1,fill=self.__rand_color(0,80))

    # 画点
    def __draw_point(self):
        for i in range(100):
            self.pen.point((randint(1, self.width-1), randint(1, self.height-1)), self.__rand_color(30,100))

    def __rand_line(self):
        for i in range(5):
            self.pen.line([(randint(1, self.width-1), randint(1, self.height-1)), (randint(1, self.width-1), randint(1, self.height-1))], fill=self.__rand_color(50,150), width=2)


#单例属性
vc = VerifyCode()

App.forms

from flask import session
from flask_wtf import FlaskForm
from wtforms import StringField
from wtforms.validators import ValidationError


class RegisterForm(FlaskForm):
    code = StringField()
    def validate_code(self,field):
        print(field.data ,session.get('code'))
        if field.data != session.get('code'):
            raise ValidationError("验证码匹配失败")

register.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="{{ url_for('bp.register_user') }}" method="post">
    {{ form.csrf_token }}
    <input type="text" name="code">
    <img src="{{ url_for('bp.verify_code') }}" alt="" onclick="this.src={{ url_for('bp.verify_code') }}+'?'+Math.random()">
     {% for error in form.code.errors %}
        <span>{{ error }}</span>
    {% endfor %}
    <br>
    <input type="submit">
</form>
</body>
</html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值