热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

WTForm表单验证

flask-WTF是对WTForms的再封装,使其更好更方便地适用于flask框架。WTForms表单的两个主要功能是验证用户提交数据的合法性和渲染模板,至于渲染模板这个功能由于前

flask-WTF是对WTForms的再封装,使其更好更方便地适用于flask框架。WTForms表单的两个主要功能是验证用户提交数据的合法性和渲染模板,至于渲染模板这个功能由于前后端分离的开发模式而变得有些鸡肋。

安装:pip3 install flask-WTF

安装flask-WTF的时候也会自动把WTForms也安装了。

对于表单验证,如注册表单,要输入用户名,密码,重复密码,而且有很多规则限制,如长度,必须字母开头且包含数字字母下划线中的两种或以上等等,这时候就得在后端做很多逻辑判断,比较烦杂。WTForms可以帮我们来处理验证问题。

以下是登录注册过程的表单验证处理:


app.py:

 

1 from flask import Flask,request,render_template
2 from forms_verify import RegisterForm,LoginForm
3 app = Flask(__name__)
4
5 @app.route('/')
6 def hello_world():
7 return "hello world"
8
9 @app.route('/register',methods=['GET','POST'])
10 def register():
11 if request.method == "GET":
12 return render_template('register.html')
13 else:
14 form = RegisterForm(request.form)
15 if form.validate():
16 return "注册成功!!"
17 else:
18 return return_err_message('register.html',form)
19
20
21 @app.route('/login',methods=['GET','POST'])
22 def login():
23 if request.method == "GET":
24 return render_template('login.html')
25 else:
26 form = LoginForm(request.form)
27 if form.validate():
28 return "登录成功!!"
29 else:
30 return return_err_message('login.html',form)
31
32
33 def return_err_message(template,form):
34 ''' 将返回错误提示信息功能抽离出来单独作为一个函数'''
35 print(form.errors)
36 err_message = list(form.errors.values())[0][0] # 错误信息的字符串提取
37 print(err_message)
38 cOntent= {
39 'err_message': err_message
40 }
41 return render_template(template, **content)
42
43
44 if __name__ == '__main__':
45 app.run()

forms_verify.py :表单验证

1 from wtforms import Form,StringField,IntegerField,FileField
2 from wtforms.validators import ValidationError,Length,EqualTo,Email,InputRequired,Regexp,NumberRange,URL,UUID
3 from flask_wtf.file import FileRequired,FileAllowed
4
5 """ 表单验证 """
6
7 class RegisterForm(Form): # 继承自Form
8 """注册表单验证"""
9 email = StringField(validators=[Email(message="邮箱格式不正确")])# message:错误提示信息
10 # validators:验证器,可多个,列表形式表示
11 username = StringField(validators=[InputRequired(message="您未输入")])
12 pwd = StringField(validators=[Length(min=6, max=12, message="密码长度必须为6至12位")])
13 pwd_rep = StringField(validators=[EqualTo('pwd',message="两次密码输入必须一致")])
14 age = IntegerField(validators=[NumberRange(12, 120,message="年龄超出范围")])
15 phOne= StringField(validators=[Regexp(r'1(3[0-9]|4[579]|5[0-3,5-9]|6[6]|7[0135678]|8[0-9]|9[89])\d{8}',message="手机号格式不正确"),
16 Length(min=11, max=11, message="手机号格式不正确")])
17 homepage = StringField(validators=[URL(message="url格式不正确")])
18 uuid = StringField(validators=[UUID(message="uuid格式不正确")])
19
20 class LoginForm(Form):
21 """ 登录表单验证 """
22 username = StringField(validators=[Length(min=6, max=12, message="用户名长度必须为6至12位")])
23 pwd = StringField(validators=[Length(min=6, max=12, message="密码长度必须为6至12位")])
24
25 captcha = StringField(validators=[Length(4,4,message="验证码错误")])
26 def validate_captcha(self,filed):
27 """这里方法名必须validate_字段名,假设验证码为9850"""
28 if filed.data != "9850":
29 raise ValidationError("验证码错误")

常用的验证器:

1. Email:验证上传的数据是否为邮箱。
2. EqualTo:验证上传的数据是否和另外一个字段相等,常用的就是密码和确认密码两个字段是否相等。
3. InputRequir:验证输入是否为空。
3. Length:长度限制,有min和max两个值进行限制。
4. NumberRange:数字的区间,有min和max两个值限制,如果处在这两个数字之间则满足。
5. Regexp:自定义正则表达式。
6. URL:必须要是URL的形式。
7. UUID:验证UUID。

 


login.html:

1 DOCTYPE html>
2 <html lang="en">
3 <head>
4 <meta charset="UTF-8">
5 <title>logintitle>
6 head>
7 <body>
8 <form action="" method="post">
9 <table>
10 <tr>
11 <td>用户名:td>
12 <td><input type="text" name="username">td>
13 tr>
14 <tr>
15 <td>密码:td>
16 <td><input type="password" name="pwd">td>
17 tr>
18 <tr>
19 <td>验证码:td>
20 <td><input type="text" name="captcha">td>
21 tr>
22 <tr>
23 <td>td>
24 <td><input type="submit" value="立即登录">td>
25 tr>
26 table>
27 {% if err_message %}
28 <p style="color: red">{{ err_message }}p>
29 {% endif %}
30 form>
31 body>
32 html>

register.html:

1 DOCTYPE html>
2 <html lang="en">
3 <head>
4 <meta charset="UTF-8">
5 <title>registertitle>
6 head>
7 <body>
8 <form action="" method="post">
9 <table>
10 <tr>
11 <td>邮箱:td>
12 <td><input type="text" name="email">td>
13 tr>
14 <tr>
15 <td>用户名:td>
16 <td><input type="text" name="username">td>
17 tr>
18 <tr>
19 <td>密码:td>
20 <td><input type="password" name="pwd">td>
21 tr>
22 <tr>
23 <td>重复密码:td>
24 <td><input type="password" name="pwd_rep">td>
25 tr>
26 <tr>
27 <td>年龄:td>
28 <td><input type="text" name="age">td>
29 tr>
30 <tr>
31 <td>手机号:td>
32 <td><input type="text" name="phone">td>
33 tr>
34 <tr>
35 <td>主页:td>
36 <td><input type="text" name="homepage">td>
37 tr>
38 <tr>
39 <td>UUID:td>
40 <td><input type="text" name="uuid">td>
41 tr>
42 <tr>
43 <td>td>
44 <td><input type="submit" value="立即注册">td>
45 tr>
46 table>
47 {% if err_message %}
48 <p style="color: red">{{ err_message }}p>
49 {% endif %}
50 form>
51 body>
52 html>

 

 实际页面:

 


自定义验证器:

如果想要对表单中的某个字段进行更细化的验证,那么可以针对这个字段进行单独的验证。如验证码,步骤如下:
1. 定义一个方法,方法的名字规则是:'validate_字段名(self,filed)'。
2. 在方法中,使用'field.data'可以获取到这个字段的具体的值。
3. 如果数据满足条件,那么可以什么都不做。如果验证失败,那么应该抛出一个'wtforms.validators.ValidationError'的异常,并且把验证失败的信息传到这个异常类中。

 



推荐阅读
  • 在springmvc框架中,前台ajax调用方法,对图片批量下载,如何弹出提示保存位置选框?Controller方法 ... [详细]
  • Python使用Pillow包生成验证码图片的方法
    本文介绍了使用Python中的Pillow包生成验证码图片的方法。通过随机生成数字和符号,并添加干扰象素,生成一幅验证码图片。需要配置好Python环境,并安装Pillow库。代码实现包括导入Pillow包和随机模块,定义随机生成字母、数字和字体颜色的函数。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
  • 本文介绍了一个适用于PHP应用快速接入TRX和TRC20数字资产的开发包,该开发包支持使用自有Tron区块链节点的应用场景,也支持基于Tron官方公共API服务的轻量级部署场景。提供的功能包括生成地址、验证地址、查询余额、交易转账、查询最新区块和查询交易信息等。详细信息可参考tron-php的Github地址:https://github.com/Fenguoz/tron-php。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • 基于dlib的人脸68特征点提取(眨眼张嘴检测)python版本
    文章目录引言开发环境和库流程设计张嘴和闭眼的检测引言(1)利用Dlib官方训练好的模型“shape_predictor_68_face_landmarks.dat”进行68个点标定 ... [详细]
  • 本文主要复习了数据库的一些知识点,包括环境变量设置、表之间的引用关系等。同时介绍了一些常用的数据库命令及其使用方法,如创建数据库、查看已存在的数据库、切换数据库、创建表等操作。通过本文的学习,可以加深对数据库的理解和应用能力。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • 本文介绍了解决java开源项目apache commons email简单使用报错的方法,包括使用正确的JAR包和正确的代码配置,以及相关参数的设置。详细介绍了如何使用apache commons email发送邮件。 ... [详细]
author-avatar
广东没有名字的世界
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有