flask-wtf表单验证与pillow图形验证码

2023-11-06 00:50

本文主要是介绍flask-wtf表单验证与pillow图形验证码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

flask-wtf用来验证表单数据,pillow用来生成图片验证码
1. 安装

pip install flask-wtf
pip install pillow

编写
  1. 在flask项目下创建form.py,表单验证类
from flask_wtf import FlaskForm  # 继承的父类
from wtforms import StringField, PasswordField, DateField  # 字段
from wtforms.validators import DataRequired, Length, ValidationError, EqualTo  # 验证器
import re
from flask_wtf.file import FileField, FileRequired, FileAllowed  # 文件上传
from exts import cache  # 缓存# 定义表单验证类
class UserRegisterForm(FlaskForm):'''用户登录表单验证'''# <input type="text">                           必填                   长度username = StringField(label='用户名', validators=[DataRequired(), Length(max=10, message='名字太长了')])password = PasswordField('password', validators=[DataRequired(), Length(min=6, message='密码太短了')])password2 = PasswordField('password', validators=[DataRequired(),# 判断两个字段是否一致EqualTo(fieldname='password', message='两次密码不一致')])phone = StringField(label='手机号', validators=[DataRequired(), Length(max=11, min=11, message='11位手机号')])# 文件上传                                                                              内部自动转换成小写icon = FileField(label='头像', validators=[FileRequired(message='未上传'), FileAllowed(['png', 'jpg', 'gif'], message='文件格式不对')])# 验证码yzm = StringField(validators=[DataRequired(message='请输入验证码')])def validate_yzm(self, data):'''对比验证码'''code = cache.get('code')input_code = data.data# 转换成小写验证if code != input_code:raise ValidationError('验证码错误')# 单字段验证:validate_字段名def validate_username(self, data):# self.username跟data是同一个对象if data.data[0].isdigit():  # 查看第一位是否是数字raise ValidationError('不能以数字开头')def validate_phone(self, data):'''正则验证手机号'''phone = data.dataif not re.search(r'^1[3875]\d{9}$', phone):raise ValidationError('手机号格式不对')
  1. 在flask项目下创建generate_img.py,生成图片验证码
from PIL import Image, ImageFont, ImageDraw, ImageFilter
import randomdef random_RGB():'''随机生成RGB'''return (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))def yzm():'''生成图片验证码'''s = 'qwertyuiop1234567890lkjhgfdsazxcvbnm'   # 26个单词跟0-9数字size = (120, 60)  # 图片大小yzm_img = Image.new('RGB', size, color=random_RGB())  # 生成画布,随机生成RGB颜色my_font = ImageFont.truetype('static/fonts/ARIALUNI.TTF', size=50)  # 添加字体文件,字体大小draw = ImageDraw.Draw(yzm_img)  # 创建画图对象code = ''  # 初始化验证码# 开始绘制for i in range(4):t = random.choice(s)  # 从s里面随机选取一个code += t  # 保存验证码,后面用来跟前端的比较# xy坐标,注意字体间隔                  字体        字体颜色draw.text(xy=(i*30, 0), text=t, font=my_font, fill=random_RGB())# 画干扰线for j in range(5):draw.line(xy=((5, random.randint(10, 55)), (115, random.randint(10, 50))), fill=random_RGB())# 添加滤镜yzm_img = yzm_img.filter(ImageFilter.DETAIL)return code, yzm_imgif __name__ == '__main__':code, yzm_img = yzm()# yzm_img.show()
在视图使用
from flask import render_template, make_response
import os, io
from utils.generate_img import yzm  # 验证码
from .form import UserRegisterForm  # 表单验证
from exts import cache  # 缓存# url_prefix为路由前导,以下路由全部要加路由前导,例如:/user/register
user_bp = Blueprint('user', __name__, url_prefix='/user')# 表单验证测试
@user_bp.route('/test_register', methods=['GET', 'POST'])
def test_register():form = UserRegisterForm()if form.validate_on_submit():  # 验证表单# 接收表单数据password = form.password.data  # flask_wtf的表单接收可以这样phone = request.form.get('phone')icon = form.icon.data# 保存图片文件filename = secure_filename(icon.filename)  # 返回一个安全的文件名path = os.path.join(settings.BASE_DIR, 'test\\')  # C:\Users\zhang\Desktop\flask_blog\testicon.save(path + filename)  # 保存文件# print(filename, path)return 'ok'return render_template('test/register.html', form=form)@user_bp.route('/get_img')
def get_img():'''返回一个图形验证码'''# 调用生成图片验证码的函数code, yzm_img = yzm()# 验证码保存到rediscache.set('code', code, timeout=180)# 创建一个缓冲区buffer = io.BytesIO()# 将图片保存到缓冲区yzm_img.save(buffer, 'jpeg')# 获取缓冲区里的二进制图片b_img = buffer.getvalue()# 二进制图片交给响应,响应头要改为图片类型res = make_response(b_img)res.headers['Content-Type'] = 'image/jpg'
前端渲染
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script><title>Title</title>
</head>
<body>
<h1>注册</h1>
<form method="post" action="{{ url_for('user.test_register') }}" enctype="multipart/form-data">{{ form.csrf_token }}用户名---{{ form.username.label }}{{ form.username }}{{ form.username.errors[0] }}<br>密码{{ form.password }}{{ form.password.errors[0] }} <br>再次输入{{ form.password2 }}{{ form.password2.errors.0 }}<br>{{ form.phone.label }}{{ form.phone }}{{ form.phone.errors.0 }}<br>头像{{ form.icon }}{{ form.icon.errors.0 }}<br>验证码{{ form.yzm }}{{ form.yzm.errors.0 }}<img src="{{ url_for('user.get_img') }}" alt="验证码" id="yzm_img"><br><input type="submit" value="注册">
</form>
<script>// 点击切换验证码$('#yzm_img').click(function(){// 后面添加一个随机数,不同的请求才能切换$(this).attr('src', "{{ url_for('user.get_img') }}?key=" + Math.random());// $(this).attr('src', "{{ url_for('user.get_img') }}");});
</script>
</body>
</html>
效果

在这里插入图片描述

说明一下,上面的代码种redis的缓存配置在之前的文章有说明了

这篇关于flask-wtf表单验证与pillow图形验证码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/353514

相关文章

Python 安装和配置flask, flask_cors的图文教程

《Python安装和配置flask,flask_cors的图文教程》:本文主要介绍Python安装和配置flask,flask_cors的图文教程,本文通过图文并茂的形式给大家介绍的非常详细,... 目录一.python安装:二,配置环境变量,三:检查Python安装和环境变量,四:安装flask和flas

opencv图像处理之指纹验证的实现

《opencv图像处理之指纹验证的实现》本文主要介绍了opencv图像处理之指纹验证的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录一、简介二、具体案例实现1. 图像显示函数2. 指纹验证函数3. 主函数4、运行结果三、总结一、

springboot security验证码的登录实例

《springbootsecurity验证码的登录实例》:本文主要介绍springbootsecurity验证码的登录实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录前言代码示例引入依赖定义验证码生成器定义获取验证码及认证接口测试获取验证码登录总结前言在spring

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应

Python实现自动化接收与处理手机验证码

《Python实现自动化接收与处理手机验证码》在移动互联网时代,短信验证码已成为身份验证、账号注册等环节的重要安全手段,本文将介绍如何利用Python实现验证码的自动接收,识别与转发,需要的可以参考下... 目录引言一、准备工作1.1 硬件与软件需求1.2 环境配置二、核心功能实现2.1 短信监听与获取2.

Python实现自动化表单填写功能

《Python实现自动化表单填写功能》在Python中,自动化表单填写可以通过多种库和工具实现,本文将详细介绍常用的自动化表单处理工具,并对它们进行横向比较,可根据需求选择合适的工具,感兴趣的小伙伴跟... 目录1. Selenium简介适用场景示例代码优点缺点2. Playwright简介适用场景示例代码

最新Spring Security实战教程之表单登录定制到处理逻辑的深度改造(最新推荐)

《最新SpringSecurity实战教程之表单登录定制到处理逻辑的深度改造(最新推荐)》本章节介绍了如何通过SpringSecurity实现从配置自定义登录页面、表单登录处理逻辑的配置,并简单模拟... 目录前言改造准备开始登录页改造自定义用户名密码登陆成功失败跳转问题自定义登出前后端分离适配方案结语前言

Flask 验证码自动生成的实现示例

《Flask验证码自动生成的实现示例》本文主要介绍了Flask验证码自动生成的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习... 目录生成图片以及结果处理验证码蓝图html页面展示想必验证码大家都有所了解,但是可以自己定义图片验证码

Flask解决指定端口无法生效问题

《Flask解决指定端口无法生效问题》文章讲述了在使用PyCharm开发Flask应用时,启动地址与手动指定的IP端口不一致的问题,通过修改PyCharm的运行配置,将Flask项目的运行模式从Fla... 目录android问题重现解决方案问题重现手动指定的IP端口是app.run(host='0.0.

Python结合Flask框架构建一个简易的远程控制系统

《Python结合Flask框架构建一个简易的远程控制系统》这篇文章主要为大家详细介绍了如何使用Python与Flask框架构建一个简易的远程控制系统,能够远程执行操作命令(如关机、重启、锁屏等),还... 目录1.概述2.功能使用系统命令执行实时屏幕监控3. BUG修复过程1. Authorization