如何使用WTForms对表单进行验证?
WTForms的作用主要有两点:
1、验证表单
2、渲染模板
当然,还有其它功能:比如上传文件、CSRF保护。本章就为大家讲讲如何使用WTForms对表单进行验证?
在使用WTForms插件之前,请确保你电脑已安装了WTForms!安装Flask-Wtf默认会安装WTForms,安装代码如下:
pip install flask-wtf
在templates新建一个resigt.html文件,代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>注册页面</title>
</head>
<body>
<form action="" method="post">
<table>
<tr>
<td>姓名</td>
<td><input type="text" name="name"></td>
</tr>
<tr>
<td>密码</td>
<td><input type="password" name="password"></td>
</tr>
<tr>
<td>确认密码</td>
<td><input type="password" name="repeat_pwd"></td>
</tr>
<tr>
<td><input type="submit" name="sub" value="注册"></td>
</tr>
</table>
</form>
</body>
</html>
新建一个flask项目(flask_wtf_demo.py),其代码如下:
from flask import Flask,request,render_template
app = Flask(__name__)
@app.route('/')
def index():
return "hello,python!"
@app.route('/regist',methods=["GET","POST"])
def resigt():
if request.method == "GET":
return render_template("resigt.html")
else:
pass
if __name__ == "__main__":
app.run(debug=True)
运行flask_wtf_demo文件代码,结果如下:
界面丑了点,大伙将就着看!下面我们先用传统方法来验证用户提交数据合法性,代码如下:
from flask import Flask,request,render_template
app = Flask(__name__)
@app.route('/')
def index():
return "hello,python!"
@app.route('/regist',methods=["GET","POST"])
def resigt():
if request.method == "GET":
return render_template("resigt.html")
else:
#通过requesr.form来获取用户输入的值
name = request.form.get("name")
password = request.form.get("password")
repeat_pwd = request.form.get("repeat_pwd")
# 如果name长度小于3或者name长度大于6,则用户名不合法
if len(name) < 3 or len(name) > 6:
return "用户名不合法"
# 如果密码长度小于3或者密码长度大于10,则密码不合法
if len(password) < 3 or len(password) > 10:
return "密码不合法"
# 如果密码与确认密码不一致,则不合法
if len(repeat_pwd) != len(password):
return "两次密码输入不一样"
else:
return "注册数据提交成功"
if __name__ == "__main__":
app.run(debug=True)
我们再运行上述代码,结果如下:
我们先输入合法数据试试,结果如下:
再输入不合法数据,结果如下:
上面代码虽然能实现用户数据验证,但是代码太复杂了,一大坨,很恶心,是吧!有没有既能实现效果,又能简化代码的法子呢?答案是有,那就是使用WTForms。
首先我们从wtfroms库中导入Form、StringField(用户验证input字段类型)代码如下:
from wtforms import Form,StringField
创建一个表单验证类,传如参数Form(不传参数是一个普通类),代码如下:
class RegistForm(Form):
pass
接着从wtforms.validator中导入Length,EqualTo(验证用户输入字符长度及密码与确认密码是否一致),代码如下:
from swtforms.validator import Length,EqualTo
在该类中定义需要验证的字段及相应的验证条件。注意:name、password、repeat_pwd需与input中name保持一致!代码如下:
class RegistForm(Form):
name = StringField(validators=[Length(max=6,min=3)])
password = StringField(validators=[Length(max=10,min=3)])
repeat_pwd = StringField(validators=[Length(max=10,min=3),EqualTo("password")])
我们再把之前哪段恶心的代码删除,要删除的代码如下:
name = request.form.get("name")
password = request.form.get("password")
repeat_pwd = request.form.get("repeat_pwd")
# 如果name长度小于3或者name长度大于6,则用户名不合法
if len(name) < 3 or len(name) > 6:
return "用户名不合法"
# 如果密码长度小于3或者密码长度大于10,则密码不合法
if len(password) < 3 or len(password) > 10:
return "密码不合法"
# 如果密码与确认密码不一致,则不合法
if len(repeat_pwd) != len(password):
return "两次密码输入不一样"
else:
return "注册数据提交成功"
删除代码之后,我们在实例化一个RegistForm对象赋值给form(其参数为我们要查找的字段)。代码如下:
form = RegistForm(request.form)
然后我们再判断用户提交数据是否合法,如果合法则返回success,否则返回fail,代码如下:
form = RegistForm(request.form)
if form.validate():
return "success"
else:
return "fail"
跟之前代码相比,是不是简洁很多,是吧?看着都舒服!
我们再运行flask_wtf_demo文件,运行效果如下:
我们先输入合法数据,然后再点击注册,结果如下:
我们再输入不合法数据试试,结果如下:
输入不合法数据,结果返回fail,虽然结果返回正确,但用户体验不太好!如果用户输入不合法数据,提示报错信息,代码如下:
if form.validate():
return "success"
else:
print(form.errors)
return "fail"
我们再输入不合法数据试试,结果如下:
上图信息提示password字段必须在3到10位数之间,虽然我们知道出错信息在哪,但是洋文看好去很头痛,尤其是我们英语不好的同学,估计看着英语就晕了!还有没有更友好的,支持汉语的法子。方法:在验证器中定义message参数,代码如下所示:
class RegistForm(Form):
name = StringField(validators=[Length(max=6,min=3)])
password = StringField(validators=[Length(max=10,min=3,message="密码长度必须大于3并且小于10")])
repeat_pwd = StringField(validators=[Length(max=10,min=3,message="密码长度必须大于3并且小于10"),EqualTo("password")])
我们再输入不合法字符试试,结果如下
用户体验是不是比之前好很多,是吧!关于WTForms基本使用今天就讲到这里。
上一篇: 什么样的社区能够成为集大成者?- SNS之我见(四)
下一篇: ES6(6)—— 新增字符串方法
推荐阅读
-
如何使用VeeValidate在vue项目内进行表单校验功能
-
wicket基础应用(1)--使用wicket对表单中的数据进行验证
-
vue如何使用rules对表单字段进行校验
-
WTForms表单验证的基本使用
-
java如何对map进行排序详解(map集合的使用)
-
探讨:如何使用委托,匿名方法对集合进行万能排序
-
迅捷流程图软件如何使用?使用迅捷流程图对素材作品进行撤销删除的方法
-
data loader怎么用 如何使用data loader对SalesForce数据进行导入、导出和删除
-
AngularJS中如何使用$http对MongoLab数据表进行增删改查
-
使用AD对Linux客户端进行身份验证