Flask框架之WTForms(详解)

news2024/12/24 20:37:34

目录

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.data
    age = 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,ValidationError


class 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.coloradmin.cn/o/698763.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

十九、socket套接字编程(一)——UDP

文章目录 一、socket套接字编程接口&#xff08;一&#xff09;socket头文件&#xff08;二&#xff09;socket 常见API&#xff08;套接字编程接口&#xff09;1. 创建 socket 文件描述符 (TCP/UDP, 客户端 服务器 )2.绑定网络信息 (TCP/UDP, 服务器 )3.开始监听 socket (TCP…

如何使用 OCI Artifacts、ORAS 和 Docker Hub 标准化软件交付

Docker Hub 是最著名的用于分发和共享容器映像的注册表。不过, Docker Hub 和其他符合 OCI 的注册表现在可以做的不仅仅是容器镜像。ORAS (OCI 注册表作为存储)项目将注册表转换为通用工件存储,能够发布与您的应用程序相关的任何资产。 在本文中,您将了解 ORAS 是什么、它…

echarts-热力图+高亮+轨迹

var mapData [{name: "北京",devicesCount: 100, //总数value: 10, //使用个数},{name: "天津",devicesCount: 50,value: 20,},{name: "上海",devicesCount: 80,value: 30,},{name: "重庆",devicesCount: 90,value: 40,},{name: "…

HOT28-两数相加

leetcode原题链接&#xff1a;两数相加 题目描述 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设…

搭建mysql集群(Windows环境)

1、MySQL集群简介 MySQL群集技术在分布式系统中为MySQL数据提供了冗余特性&#xff0c;增强了安全性&#xff0c;使得单个MySQL服务器故障不会对系统产生巨大的负面效应&#xff0c;系统的稳定性得到保障。 MySQL群集需要有一组计算机&#xff0c;每台计算机的…

element封装 table表格 ,插槽的使用,修改el-table-column的值

举例 vue2这种不封装的 直接写的很罗嗦麻烦 下面圈起来的可以封装一个对象 进行循环 弊端: 循环后 无法进行获取更改某一列的值 比如data日期我需要转换年月日 不循环我直接在这个el-table-column的这一列进行写&#xff08;如下&#xff09; <el-table-column label&quo…

COMSOL基于随机Voronoi骨架的三维多孔材料泡沫铝骨小梁模型力学分析

力学模型 模型计算为圆柱体试件轴压模型&#xff0c;在轴向荷载作用下应力分布的计算。 几何生成 采用CAD Voronoi3D插件在AutoCAD内直接生成三维Voronoi&#xff0c;其计算参数如下&#xff1a; 模型生成后删除晶格部件&#xff0c;并对晶粒进行一步平滑处理&#xff1a…

Centos7系统,虚拟机断电后启动报错:You might want to save “/run/initramfs/rdsosreport.txt“

虚拟机突然断电造成centos8系统无法启动 Linux报You might want to save “/run/initramfs/rdsosreport.txt“ to a USB stick or /boot after mounting 1.解决方法&#xff1a; 大家可以用umr查看到自己装的镜像对应的以-root结尾的文件是哪个。因为大家装的镜像不同&#x…

多语言翻译node工具

多语言 i18n 翻译node工具 介绍 本文是为了方便使用 i18n的翻译工具&#xff0c;实现把excel的内容追加或更改到项目中的多语言文件中主要文件为 index.js 、test.txt 和 dist 文件夹内所有内容&#xff08;dist为项目中需要翻译的多语言文件&#xff0c;下面有例子&#xff…

有源、无源晶振的区别

在PCB设计中&#xff0c;晶振&#xff08;晶体振荡器&#xff09;是非常重要的电子元器件&#xff0c;相信大部分的PCB工程师对它都不会陌生。而对于有源晶振与无源晶振&#xff0c;很多人却是“傻傻分不清楚”。 我们知道&#xff0c;电子线路中的晶体振荡器分为无源晶振和有源…

TI AM64x工业核心板硬件说明书(双核ARM Cortex-A53 + 单/四核Cortex-R5F + 单核Cortex-M4F,主频1GHz)

1 硬件资源 创龙科技SOM-TL64x是一款基于TI Sitara系列AM64x双核ARM Cortex-A53 单/四核Cortex-R5F 单核Cortex-M4F设计的多核工业级核心板&#xff0c;通过工业级B2B连接器引出5x TSN Ethernet、9x UART、2x CAN-FD、GPMC、PCIe/USB 3.1等接口。核心板经过专业的P…

如何配置git的.bashrc文件

1、进入到.git文件里&#xff1a;新建一个.bashrc文件 2、打开.bashrc文件添加配置信息&#xff1a; 代码&#xff1a; #用于输出git提交日志 alias git-loggit log --prettyoneline --all --graph --abbrev-commit #用于输出当前目录所有文件及基本信息 alias llls -al …

Git入门(职场必备工具)

目录 一、git在职场中的重要性 1.1git是什么&#xff1f; 1.2什么是版本控制 1.3学习这个工具的作用和目的 二、Git开发必备技能及其应用场景 2.1 如何用Git对一个目录进行版本控制流程&#xff1f; 三、Git 如何上传和提取代码 3.1 克隆远端库到本地库 3.2 将本地库推…

硬件学习件Cadence day12 PCB设计中打地孔与地孔设计,PCB 后期处理,钻孔文件导出

1. 制作 过地孔的焊盘 &#xff08;两种方法&#xff09;&#xff08;又叫制作盲埋孔&#xff09; 1.1 制作热风焊盘 &#xff08;之前的教程有&#xff0c;现在只给数据&#xff09; 1.2 第一种 allegro 外部 焊盘软件制作 1.2.1 打开软件 1.2.2 制作焊盘&#xff0c;查看…

使用Divi创建在线学习管理 (LMS) 网站

我喜欢在线学习课程。开始一个设计良好、组织良好、内容丰富的线上课程是有道理的。如果做得好&#xff0c;这些线上课程可以让您充满成就感。但是学习一门很棒的线上课程和创建一个线上课程是两种完全不同的体验。根据我的经验&#xff0c;创建学习管理/线上课程网站可能是一个…

自动刷新工具--可以自动编辑安居客房源信息

本工具可以自动刷新安居客的房源信息&#xff0c;不是爬虫&#xff0c;就是一款解放劳动力的RPA工具 使用方法&#xff1a; 1. 首先输入要自动刷新的房源id 2.点击 开始执行 如果需要免密登陆&#xff0c;需要在个人中心填上anjuke的账密 定时执行 声明&#xff1a;此工具只是…

kafka入门,数据可靠性(八)

1、回顾发送流程 2、ACK应答原理 0&#xff1a;生斥责发送过来的数据&#xff0c;不需要等数据落盘应答&#xff08;数据可靠性分析&#xff1a;丢数&#xff09; 1&#xff1a;生产者发送过来的数据&#xff0c;leader收到数据后应答&#xff08;数据可靠性分析&#xff1a;丢…

前端网络基础

目录 网络分层模型OSI七层模型TCP/IP四层模型TCP/IP五层模型 HTTP传递消息的模式传递消息的格式响应码 URL用户代理/user agent自动发送请求自动解析响应 AJAXXHRFetch 跨域同源与异源网络通信中的跨域浏览器对跨域的限制CORS简单请求对简单请求的验证 预检请求对预检请求的验证…

第4讲:使用ajax技术实现菜单展开或隐藏功能(xml数据)

使用ajax技术实现点击菜单时&#xff0c;展开当前子菜单列表&#xff0c;隐藏其他子菜单功能&#xff1b;前端使用静态html页面生成一级菜单&#xff0c;当点击某个菜单时&#xff0c;发送数据到后端(jsp文件)&#xff0c;利用responseXML返回xml格式文件&#xff0c;刷新二级菜…

机器学习李宏毅学习笔记35

文章目录 前言一、Meta learning1.第一步2.第二步3.第三步 二、machine learning 和 meta learning区别总结 前言 Meta learning元学习&#xff1a;学习如何学习 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、Meta learning 学习这件事也是一个…