当前位置: 首页 > news >正文

Flask校验

WTForms 是一个 Python 库,用于处理和验证 Web 表单。它提供了很多功能来简化表单处理,包括字段类型、验证器、错误消息等。在 WTForms 中,validate 机制是用于确保表单数据满足特定条件的关键部分。

1.验证器(Validators)

WTForms 提供了多种内置的验证器,如 DataRequired, Length, Email, EqualTo 等,这些可以被添加到表单字段上以执行特定的验证规则。例如:

from wtforms import StringField, validatorsclass LoginForm(Form):username = StringField('Username', [validators.DataRequired()])password = PasswordField('Password', [validators.DataRequired(),validators.Length(min=8)])

在这个例子中,DataRequired 确保字段不为空,Length 则确保密码长度至少为 8。

2.自定义验证器

你也可以定义自己的验证函数,并将其作为验证器使用。这个函数应该接收表单实例和字段实例作为参数,并在验证失败时抛出 ValidationError 异常。例如:

from wtforms import StringField, ValidationError
from wtforms.validators import StopValidationdef unique_username(form, field):if User.query.filter_by(username=field.data).first():raise ValidationError('Username already exists.')class RegistrationForm(Form):username = StringField('Username', [unique_username])

在这个例子中,unique_username 函数检查数据库中是否已存在相同的用户名,如果存在,则抛出 ValidationError

3.全局验证

除了字段级别的验证之外,你还可以定义全局验证方法,在表单类中定义以 validate_ 开头的方法,后面跟着字段名,这会触发对整个表单的验证。这种方法通常用于需要跨多个字段的复杂验证逻辑。例如:

class RegistrationForm(Form):username = StringField('Username')password = PasswordField('Password')confirm_password = PasswordField('Confirm Password')def validate_confirm_password(self, field):if field.data != self.password.data:raise ValidationError('Passwords do not match.')

这里,validate_confirm_password 方法确保用户输入的密码与其确认密码相同。

4. 使用多个验证器

你可以将多个验证器应用于同一个字段,例如,确保电子邮件格式正确并且非空:

from wtforms import StringField, EmailField
from wtforms.validators import DataRequired, Emailclass ContactForm(Form):email = EmailField('Email', validators=[DataRequired(), Email()])

5. 自定义验证器示例 - 检查年龄

假设你想要验证用户年龄必须大于18岁:

from datetime import datedef is_adult(form, field):today = date.today()age = today.year - field.data.year - ((today.month, today.day) < (field.data.month, field.data.day))if age < 18:raise ValidationError('You must be at least 18 years old.')class RegistrationForm(Form):birth_date = DateField('Birth Date', validators=[is_adult])

6. 验证唯一性 - 检查用户名或邮箱是否已被注册

在数据库中检查某个值是否唯一:

from myapp.models import Userdef unique_username(form, field):if User.query.filter_by(username=field.data).first() is not None:raise ValidationError('Username already exists.')def unique_email(form, field):if User.query.filter_by(email=field.data).first() is not None:raise ValidationError('Email already exists.')class RegistrationForm(Form):username = StringField('Username', validators=[unique_username])email = StringField('Email', validators=[unique_email])

7. 自定义错误消息

你可以覆盖默认的错误消息,使其更加友好或具体:

class ContactForm(Form):subject = StringField('Subject', validators=[DataRequired(message='Please enter a subject.')])message = TextAreaField('Message', validators=[Length(max=200, message='Your message is too long.')])

下面是一个使用 验证器的用户注册完整例子:

from wtforms import Form, StringField, PasswordField, validatorsclass RegistrationForm(Form):username = StringField('Username', [validators.Length(min=4, max=25)])email = StringField('Email Address', [validators.Length(min=6, max=35),validators.Email()])password = PasswordField('New Password', [validators.DataRequired(),validators.EqualTo('confirm', message='Passwords must match')])confirm = PasswordField('Repeat Password')# 使用表单
form = RegistrationForm(request.form)if request.method == 'POST' and form.validate():# 如果表单验证成功,可以进一步处理数据,比如保存到数据库user = User(username=form.username.data, email=form.email.data,password=generate_password_hash(form.password.data))db.session.add(user)db.session.commit()
else:# 如果表单验证失败,显示错误消息flash_errors(form)

在这个例子中,RegistrationForm 包含了 username, email, password, 和 confirm 字段。password 字段使用了 EqualTo 验证器,它会检查 passwordconfirm 字段的值是否相同。如果这两个字段的值不同,EqualTo 验证器会抛出一个 ValidationError,并附带错误消息 “Passwords must match”。

EqualTo 验证器的第一个参数是要与当前字段比较的另一个字段的名称。在上面的例子中,password 字段通过 EqualTo('confirm')confirm 字段进行比较。

如果在实际应用中遇到问题,或者需要进一步定制验证逻辑,你也可以自定义验证函数来配合 EqualTo 或其他验证器一起使用。

相关文章:

Flask校验

WTForms 是一个 Python 库&#xff0c;用于处理和验证 Web 表单。它提供了很多功能来简化表单处理&#xff0c;包括字段类型、验证器、错误消息等。在 WTForms 中&#xff0c;validate 机制是用于确保表单数据满足特定条件的关键部分。 1.验证器&#xff08;Validators&#x…...

web前端 Vue 框架面试120题(一)

面试题 1 . 简述Vue的MVVM 模式? 参考回答&#xff1a; MVVM 是 Model-View-ViewModel的缩写&#xff0c;即将数据模型与数据表现层通过数据驱动进行分离&#xff0c;从而只需要关系数据模型的开发&#xff0c;而不需要考虑页面的表现&#xff0c;具体说来如下&#xff1a;M…...

UniApp__微信小程序项目实战 实现长列表分页,通过 onReachBottom 方法上划分次加载数据

UniApp 实现长列表分页&#xff0c;通过 onReachBottom 方法上划分次加载数据 项目实战中比较常见&#xff0c;方便下次使用 文章目录 一、应用场景? 二、作用 三、使用步骤&#xff1f;          3.1 实现的整体思路&#xff1f;    …...

数据结构(功能受限的表-栈队列)

功能受限的表结构 一、栈和队列介绍 栈和队列是两种重要的线性结构&#xff0c;从数据结构角度&#xff0c;他们都是线性表&#xff0c;特殊点在于它们的操作被限制&#xff0c;也就是所谓的功能受限&#xff0c;统称功能受限的线性表 从数据类型角度&#xff0c;它们也可以是…...

高数知识补充----矩阵、行列式、数学符号

矩阵计算 参考链接&#xff1a;矩阵如何运算&#xff1f;——线性代数_矩阵计算-CSDN博客 行列式计算 参考链接&#xff1a;实用的行列式计算方法 —— 线性代数&#xff08;det&#xff09;_det线性代数-CSDN博客 参考链接&#xff1a;行列式的计算方法(含四种&#xff0c;…...

《Techporters架构搭建》-Day01 第一个RESTful API接口

微服务架构搭建 搭建微服务架构分析一下项目的build.gradle添加Demo接口 搭建微服务架构 首先搭建系统管理模块&#xff0c;模块结构如下 tps-cloud └── tps-system -- 系统管理模块└── tps-system-api -- 系统管理模块公共api模块└── tps-system-biz -- 系统管理模…...

【C++ —— AVL树】

C —— AVL树 AVL树的概念AVL树节点的定义AVL树的插入向上调整旋转左单旋右单旋左右双旋右左双旋 AVL树的高度AVL树的验证总结&#xff1a;代码 AVL树的概念 二叉搜索树虽可以缩短查找的效率&#xff0c;但如果数据有序或接近有序二叉搜索树将退化为单支树&#xff0c;查找元素…...

跨平台webSocket模块设计技术解决方案

1. 概述 目标&#xff1a;设计并实现一个能够在多种操作系统上运行的WebSocket通讯模块&#xff0c;支持与前端浏览器和HTTPS服务端进行数据交换。技术栈&#xff1a;C11 &#xff0c;使用跨平台库如 Boost处理网络IO&#xff0c;使用 JSON 库如 nlohmann/json 解析消息。 2.…...

Drools规则引擎

一、Drools规则引擎 Drools官网&#xff1a; https://www.drools.org/Drools中文网: http://www.drools.org.cn/bilibili学习视频(黑马博学谷2020年最新Java项目Drools业务规则管理系统&#xff08;BRMS&#xff09;)&#xff1a; https://www.bilibili.com/video/BV1Pa4y1a7u…...

vue学习day11-路由、路由模块的封装、声明式导航-路由的介绍、VueRouter、router-link、自定义高亮类名

32、路由 &#xff08;1&#xff09;路由的介绍 1&#xff09;生活中的路由&#xff1a;设备和ip的映射关系 2&#xff09;路由&#xff1a;一种映射关系 3&#xff09;Vue中的路由&#xff1a;路径与组件的映射关系 &#xff08;根据路由就能知道不同的路径&#xff0c;应…...

智慧校园学期基础数据管理

在智慧校园基础数据管理之一的学期管理功能管理中&#xff0c;学期的有序管理具有重要意义。它不仅是教学活动有序开展的指挥棒&#xff0c;更是连接学校管理者、教师与学生之间沟通的桥梁&#xff0c;承载着规划、跟踪与管理学期内各项事务的重要使命。 学期管理功能的首要任务…...

ISP代理和双ISP代理:区别和优势

随着互联网技术的不断发展和普及&#xff0c;网络代理服务成为众多用户保护隐私、提高网络性能、增强安全性的重要工具。其中&#xff0c;ISP代理和双ISP代理是两种常见的网络代理服务形式。本文将详细探讨ISP代理和双ISP代理的区别和优势&#xff0c;以便用户更好地了解并选择…...

【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【22】【RabbitMQ】

持续学习&持续更新中… 守破离 【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【22】【RabbitMQ】 Message Queue 消息队列异步处理应用解耦流量控制 消息中间件概念RabbitMQ概念MessagePublisherExchangeQueueBindingConnectionChannelConsumerVirtual HostBroker图…...

概率论原理精解【4】

文章目录 度量空间概述理论基础定义特点高级概念广泛应用 性质例子应用 柯西数列柯西数列的定义柯西数列的例子 参考文献 度量空间 概述 设 f : R n → R m , f ˙ ( x ) 在 { x : ∣ x − x 0 ∣ < r } 内连续&#xff0c;则当 ∣ t ∣ < r 时&#xff0c; f:R^n\righ…...

Linux云计算 |【第一阶段】ENGINEER-DAY3

主要内容&#xff1a; LVM逻辑卷管理、VDO、RAID磁盘阵列、进程管理 一、新建逻辑卷 1、什么是逻辑卷 逻辑卷&#xff08;Logical Volume&#xff09;是逻辑卷管理&#xff08;Logical Volume Management&#xff0c;LVM&#xff09;系统中的一个概念。LVM是一种用于磁盘管理…...

springboot 实体类加注解校验入参数据

导入的是springboot自身的依赖包 import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.validation.Valid;...

关于 Qt输入法在arm特定的某些weston下出现调用崩溃 的解决方法

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/140423667 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…...

Android Studio关于Gradle及JDK问题解决

1.Android Studio 版本如&#xff1a;Android Studio Koala | 2024.1.1 2.Gradle 版本为&#xff1a;8.7 3.JDK 版本为&#xff1a;17 以上这三个必须匹配&#xff0c;具体可以看官网Android Studio 版本说明&#xff08;https://developer.android.google.cn/studio?hlzh-…...

Leetcode 205. 同构字符串

205. 同构字符串 Leetcode 205. 同构字符串 一、题目描述二、我的想法三、其他人的题解 一、题目描述 给定两个字符串 s 和 t &#xff0c;判断它们是否是同构的。 如果 s 中的字符可以按某种映射关系替换得到 t &#xff0c;那么这两个字符串是同构的。 每个出现的字符都应…...

多口适配器,给您的生活增添便利

随着科技的快速发展&#xff0c;我们的生活已离不开各种各样的电子设备&#xff0c;智能手机、平板电脑、智能手表、无线耳机……它们共同构建了我们丰富多彩的数字生活。然而&#xff0c;面对众多设备的充电需求&#xff0c;传统的单一充电口已难以满足现代人的使用习惯。在这…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台&#xff0c;以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中&#xff0c;Producer&#xff08;生产者&#xff09; 是连接客户端应用与消息队列的第一步。生产者…...

【算法训练营Day07】字符串part1

文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接&#xff1a;344. 反转字符串 双指针法&#xff0c;两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度

文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

IP如何挑?2025年海外专线IP如何购买?

你花了时间和预算买了IP&#xff0c;结果IP质量不佳&#xff0c;项目效率低下不说&#xff0c;还可能带来莫名的网络问题&#xff0c;是不是太闹心了&#xff1f;尤其是在面对海外专线IP时&#xff0c;到底怎么才能买到适合自己的呢&#xff1f;所以&#xff0c;挑IP绝对是个技…...

Git常用命令完全指南:从入门到精通

Git常用命令完全指南&#xff1a;从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...

使用SSE解决获取状态不一致问题

使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件&#xff0c;这个上传文件是整体功能的一部分&#xff0c;文件在上传的过程中…...