Flask框架之WTForms(详解)

news/2024/11/24 2:30:11/

目录

WTForms介绍和基本使用

WTForms介绍

基本使用

WTForms表单验证的基本使用

 WTForms常用验证器

 WTForms自定义验证器

场景:验证码实现

WTForms渲染模版

常用的方法

代码示例


WTForms介绍和基本使用

WTForms介绍

这个插件库主要有两个作用。

第一个是做表单验证,将用户提交上来的数据进行验证是否符合系统要求。

第二个是做模版渲染。 (了解即可)

官网:https://wtforms.readthedocs.io/en/latest/index.html

基本使用

Flask-WTF是简化了WTForms操作的一个第三方库。WTForms表单的两个主要功能是验证用户提交数据的合法性以及渲染模板。而Flask-WTF还包括一些其他的功能:CSRF保护,文件上传等。

安装Flask-WTF默认也会安装WTForms,因此使用以下命令来安装Flask-WTF和WTForms:

pip install flask-wtf

1.导入WTForms类 

在Python文件中,导入所需的WTForms类,通常是wtformswtforms.validators

from wtforms import Form, StringField, IntegerField, validators

2.定义表单类

创建一个表单类来定义您的表单字段。表单类是一个继承自wtforms.Form的类,每个表单字段都是该类的属性。

class MyForm(Form):name = StringField('Name', validators=[validators.DataRequired()])age = IntegerField('Age', validators=[validators.NumberRange(min=1, max=100)])

3.表单实例化: 

在您的视图函数或控制器中,实例化您的表单类。

form = MyForm()

4.在模板中渲染表单

在HTML模板中,使用表单的form属性渲染表单字段。

<form method="POST">{{ form.name.label }} {{ form.name() }}{{ form.age.label }} {{ form.age() }}<input type="submit" value="Submit">
</form>

5.处理表单提交

在您的视图函数或控制器中,检查表单是否被提交并验证数据。 

if form.validate_on_submit():name = form.name.dataage = form.age.data# 处理表单数据

6.验证表单数据:

在表单类的字段定义中,可以使用内置的验证器来验证数据。例如,DataRequired验证器可用于确保字段不为空,NumberRange验证器可用于验证数值的范围等。还可以使用自定义验证器来满足特定需求。 

name = StringField('Name', validators=[validators.DataRequired()])
age = IntegerField('Age', validators=[validators.NumberRange(min=1, max=100)])

WTForms表单验证的基本使用

  1. 自定义一个表单类,继承自wtforms.Form类。
  2. 定义好需要验证的字段,字段的名字必须和模版中那些需要验证的input标签的name属性值保持一致。
  3. 在需要验证的字段上,需要指定好具体的数据类型。
  4. 在相关的字段上,指定验证器。
  5. 以后在视图函数中,只需要使用这个表单类的对象,并且把需要验证的数据,也就是request.form传给这个表单类,再调用表单类对象.validate()方法进行,如果返回True,那么代表用户输入的数据都是符合格式要求的,Flase则代表用户输入的数据是有问题的。如果验证失败了,那么可以通过表单类对象.errors来获取具体的错误信息。

 WTForms常用验证器

页面把数据提交上来,需要经过表单验证,进而需要借助验证器来进行验证,以下是常用的内置验证器:

1. Length:字符串长度限制,有min和max两个值进行限制。

username = StringField(validators=[Length(min=3,max=10,message="用户名长度必须在3到10位之间")])

2. EqualTo:验证数据是否和另外一个字段相等,常用的就是密码和确认密码两个字段是否相等。

password_repeat = StringField(validators=[Length(min=6,max=10),EqualTo("password")])

3. Email:验证上传的数据是否为邮箱数据格式 如:223333@qq.com。

email = StringField(validators=[Email()])

4. InputRequired:验证该项数据为必填项,即要求该项非空。

username = StringField(validators=[input_required()])

5. NumberRange:数值的区间,有min和max两个值限制,如果处在这两个数字之间则满足。

age = IntegerField(validators=[NumberRange(12,18)])

6. Regexp:定义正则表达式进行验证,如验证手机号码。

phone = StringField(validators=[Regexp(r'1[34578]\d{9}')])

7. URL:必须是URL的形式 如http://www.bjsxt.com。

home_page = StringField(validators=[URL()])

8. UUID:验证数据是UUID类型。

uuid = StringField(validators=[UUID()])

数据项的类型,一般常用的有

from wtforms import Form,StringField,IntegerField
class RegisterForm2(Form):uname = StringField(validators=[InputRequired()])age = IntegerField(validators=[NumberRange(18,40)])

 WTForms自定义验证器

只有当WTForms内置的验证器不够使的时候,才需要使用自定义验证器。

如果想要对表单中的某个字段进行更细化的验证,那么可以针对这个字段进行单独的验证。

自定义验证器步骤如下:

  1. 定义一个方法,方法的名字规则是:validate_字段名(self,field)
  2. 在方法中,使用field.data可以获取到这个字段的具体的值。
  3. 验证时,如果数据满足条件,那么可以什么都不做。如果验证失败,

那么应该抛出一个wtforms.validators.ValidationError的异常,并且把验证失败的信息传到这个异常类中。

场景:验证码实现

关键代码:

from flask import session
from wtforms import Form,StringField,IntegerField
from wtforms.validators import Length,EqualTo,Email,InputRequired,NumberRange,Regexp,URL,UUID,ValidationErrorclass RegisterForm2(Form):email = StringField(validators=[Email()])uname = StringField(validators=[InputRequired()])age = IntegerField(validators=[NumberRange(18,40)])phone = StringField(validators=[Regexp(r'1[34578]\d{9}')])phomepage = StringField(validators=[URL()])uuid = StringField(validators=[UUID()])code = StringField(validators=[Length(4,4)])#取到的值 和服务器上 session上存储的值对比def validate_code(self,field):print(field.data,session.get('code'))if field.data != session.get('code'):raise ValidationError('验证码不一致!')

WTForms渲染模版

渲染模版是WTForms的第二个作用,不过,我们只需要了解即可,不需要花太多精力和时间去研究它。

常用的方法

  1. field(): 用于渲染字段的默认HTML控件。例如,{{ form.name() }}会渲染名为"name"的字段的默认控件。

  2. label(): 用于渲染字段的标签。例如,{{ form.name.label }}会渲染名为"name"的字段的标签。

  3. errors(): 用于渲染字段的错误消息。例如,{{ form.name.errors }}会渲染名为"name"的字段的错误消息。

代码示例

<form method="POST"><div class="form-group">{{ form.name.label(class="form-label") }}{{ form.name(class="form-control") }}{% if form.name.errors %}<ul class="error-list">{% for error in form.name.errors %}<li>{{ error }}</li>{% endfor %}</ul>{% endif %}</div><div class="form-group">{{ form.age.label(class="form-label") }}{{ form.age(class="form-control") }}{% if form.age.errors %}<ul class="error-list">{% for error in form.age.errors %}<li>{{ error }}</li>{% endfor %}</ul>{% endif %}</div><input type="submit" value="Submit" class="btn btn-primary">
</form>

使用Bootstrap样式来为表单字段添加了class属性。通过调用label()方法和class参数,可以为标签添加自定义的CSS类。通过调用字段对象的class参数,可以为表单字段添加自定义的CSS类。在错误消息部分,我们使用了一个循环来渲染所有的错误消息。


http://www.ppmy.cn/news/651727.html

相关文章

云上企业级存储 - 打开存储新维度,促进用户核心业务创新

前言 提到企业级存储&#xff0c;大家印象最深的是“高稳定”、“高性能”、“丰富的企业级特性”等关键词&#xff1b;而说到云计算&#xff0c;大家会想到“大规模”、“全球部署”、“弹性”、“服务化”、“智能化”、“即时开通"、“按量付费”这些鲜明特征。如果把…

一文读懂「云上企业级存储」

当企业级存储遇到云计算&#xff0c;两者结合会产生什么样的新存储形态呢&#xff1f;将二者完美融合是云上企业级存储的目标&#xff0c;它打开存储更多新的维度&#xff0c;在保障用户业务永续的同时&#xff0c;帮助用户更好地进行业务创新。 前言 提到企业级存储&#xf…

Intel 助力移动云百万 IOPS 云硬盘,打造极速云存储体验

前言概述 物联网、人工智能、5G 等技术带动数据爆发式增长&#xff0c;企业超大规模数据的存储与治理成本与日俱增&#xff0c;且随着数据库、实时日志分析等关键业务上云&#xff0c;企业对存储系统的性能要求也随之提升&#xff0c;存储系统面临着管理海量数据和提供极致性能…

一天2篇Nature!任职同一高校,这对教授夫妻同时发表2项医学新成果

4月13日&#xff0c;山东大学基础医学院孙金鹏和于晓教授团队在Nature 杂志分别以 “Structural basis for the tethered peptide activation of adhesion GPCRs”和“Tethered peptide activation mechanism of the adhesion GPCR ADGRG2 and ADGRG4”为题&#xff0c;背靠背发…

深入浅出雷达脉冲压缩技术

本文讲脉冲压缩技术。我在学习的时候也查过很多资料&#xff0c;尤其是网上搜到的资料&#xff0c;基本都不太清楚或者不好理解。我想通过自己的努力把脉冲压缩技术的今生前世讲讲清楚。 本文是我的第一篇文章&#xff0c;我是一名技术爱好者&#xff0c;典型的理科生&#xff…

跨越技术鸿沟,革新存储产业:华瑞指数云重磅发布下一代软件定义存储产品

2022年8月31日&#xff0c;由华瑞指数云&#xff08;ExponTech&#xff09;主办的“全自研下一代软件定义存储产品体验沙龙”在北京圆满举办。发布会现场&#xff0c;华瑞指数云重磅推出全自研极速分布式块存储产品WDS 。这是继2021年11月24日该公司在中国数据与存储峰会发布Wi…

光学中你遇到过哪些问题?

1、变焦和对焦有什么区别&#xff1f; 变焦就是改变镜头的焦距&#xff08;准确说是像距&#xff09;&#xff0c;以改变拍摄的视角&#xff0c;也就是通常所说的把被摄体拉近或推远。例如18-55mm和70-200mm镜头就是典型的变焦镜头。焦距越长&#xff0c;视角越窄。 对焦通常…

英特尔助力腾讯云深度优化云硬盘CBS 产品,打造极速云存储体验

前言概述 在更多企业核心系统“云化”的今天&#xff0c;云存储系统作为业务数据的重要载体&#xff0c;其性能表现正 受到越来越多的关注。作为全球领先的云服务提供商之一&#xff0c;腾讯云通过先进的云硬盘 CBS (Cloud Block Storage) 产品为众多行业用户提供高效、可靠…