当前位置: 首页 > 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 或其他验证器一起使用。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Ansible服务实现自动化运维
  • 微信小程序开发入门指南
  • 在STM32嵌入式中C/C++语言对栈空间的使用
  • Matlab Git管理
  • shell 条件语句
  • 不同类型的指针变量进行++操作的效果
  • allure_pytest:AttributeError: ‘str‘ object has no attribute ‘iter_parents‘
  • MongoDB文档整理
  • JavaScript:节流与防抖
  • 主页目录导航
  • Unity XR Interaction Toolkit(VR、AR交互工具包)记录安装到开发的流程,以及遇到的常见问题(一)!
  • 如何将PDF转换成可以直接编辑的CAD图纸?
  • 前端下载文件流 出现乱码 解决方案
  • Random,ThreadLocalRandom,SecureRandom有什么区别
  • 【STM32 HAL库】全双工I2S+双缓冲DMA的使用
  • Git的一些常用操作
  • Redis字符串类型内部编码剖析
  • 从伪并行的 Python 多线程说起
  • 机器学习学习笔记一
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 开源SQL-on-Hadoop系统一览
  • 快速体验 Sentinel 集群限流功能,只需简单几步
  • 前端面试之CSS3新特性
  • 算法---两个栈实现一个队列
  • Oracle Portal 11g Diagnostics using Remote Diagnostic Agent (RDA) [ID 1059805.
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • 仓管云——企业云erp功能有哪些?
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • ​queue --- 一个同步的队列类​
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • #pragma once
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (C++17) std算法之执行策略 execution
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (WSI分类)WSI分类文献小综述 2024
  • (二) Windows 下 Sublime Text 3 安装离线插件 Anaconda
  • (附源码)ssm户外用品商城 毕业设计 112346
  • (附源码)ssm跨平台教学系统 毕业设计 280843
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (精确度,召回率,真阳性,假阳性)ACC、敏感性、特异性等 ROC指标
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (全注解开发)学习Spring-MVC的第三天
  • (四)JPA - JQPL 实现增删改查
  • .\OBJ\test1.axf: Error: L6230W: Ignoring --entry command. Cannot find argumen 'Reset_Handler'
  • .gitignore
  • .net操作Excel出错解决
  • .NET精简框架的“无法找到资源程序集”异常释疑
  • @Query中countQuery的介绍
  • [240527] 谷歌 CEO 承认 AI 编造虚假信息问题难解(此文使用 @gemini 命令二次创作)| ICQ 停止运作
  • [AIGC 大数据基础]hive浅谈
  • [AIR] NativeExtension在IOS下的开发实例 --- IOS项目的创建 (一)
  • [CTO札记]如何测试用户接受度?
  • [cvpr 2024 目标检测 前沿研究 热点] cpvr 2024中与目标检测主题有关的论文
  • [Google Guava] 1.1-使用和避免null