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

发布时间:2018-07-02 编辑:汤利军 阅读:

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基本使用今天就讲到这里。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

关注我

图文推荐

云标签

友链交换