欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

如何使用WTForms对表单进行验证?

程序员文章站 2022-03-08 22:49:52
...

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文件代码,结果如下:

如何使用WTForms对表单进行验证?

界面丑了点,大伙将就着看!下面我们先用传统方法来验证用户提交数据合法性,代码如下:

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对表单进行验证?

我们先输入合法数据试试,结果如下:

如何使用WTForms对表单进行验证?

再输入不合法数据,结果如下:

如何使用WTForms对表单进行验证?

上面代码虽然能实现用户数据验证,但是代码太复杂了,一大坨,很恶心,是吧!有没有既能实现效果,又能简化代码的法子呢?答案是有,那就是使用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文件,运行效果如下:

如何使用WTForms对表单进行验证?

我们先输入合法数据,然后再点击注册,结果如下:

如何使用WTForms对表单进行验证?

我们再输入不合法数据试试,结果如下:

如何使用WTForms对表单进行验证?

输入不合法数据,结果返回fail,虽然结果返回正确,但用户体验不太好!如果用户输入不合法数据,提示报错信息,代码如下:

 if form.validate():
            return "success"
        else:
            print(form.errors)
            return "fail"

我们再输入不合法数据试试,结果如下:

如何使用WTForms对表单进行验证?

上图信息提示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对表单进行验证?

用户体验是不是比之前好很多,是吧!关于WTForms基本使用今天就讲到这里。