pip install flask-wtf

 

一、WTForms支持的HTML标准字段

字段对象

说明

StringField

文本字段

TextAreaField

多行文本字段

PasswordField

密码文本字段

HiddenField

隐藏文本字段

DateField

文本字段,值为datetime.date格式

DateTimeField

文本字段,值为datetime.datetime格式

IntegerField

文本字段,值为整数

DecimalField

文本字段,值为decimal.Decimal

FloatField

文本字段,值为浮点数

BooleanField

复选框,值为True和False

RadioField

一组单选框

SelectField

下拉列表

SelectMultipleField

下拉列表,可选择多个值

FileField

文本上传字段

SubmitField

表单提交按钮

FormField

把表单作为字段嵌入另一个表单

FieldList

一组指定类型的字段

 

二、WTForms常用验证函数

验证函数

说明

DataRequired

确保字段中有数据

EqualTo

比较两个字段的值,常用于比较两次密码输入

Length

验证输入的字符串长度

NumberRange

验证输入的值在数字范围内

URL

验证URL

AnyOf

验证输入值在可选列表中

NoneOf

验证输入值不在可选列表中

 

三、示例

from flask import Flask, redirect, request, url_for, render_template, session
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequired, EqualTo

# 创建flask应用对象
# __name__ 代表当前模块名称
# flask以当前目录为总目录,static目录为静态目录,templates为模版目录
app = Flask(__name__)

app.config["SECRET_KEY"] = "yang"

# 定义表单模型类
class RegisterForm(FlaskForm):
    # DataRequired 设置数据必填
    username = StringField(label=u"用户名:", validators=[DataRequired(u"请输入用户名")])
    password = PasswordField(label=u"密码", validators=[DataRequired("请输入密码")])
    password2 = PasswordField(label="确认密码", validators=[DataRequired("请输入秘密"), EqualTo("password", "两次密码不一致")])
    submit = SubmitField(label=u"注册")

@app.route("/")
def index():
    user_info = session.get("user_info")
    return str(user_info)

@app.route("/register", methods=["POST", "GET"])
def register():
    # 如果是post,会把前端返回的数据放到form中
    form = RegisterForm()
    # 验证表单数据是否合格
    if form.validate_on_submit():
        # 验证合格, 提取数据
        username = form.username.data
        password = form.password.data
        print("username: %s, password=%s" % (username, password))
        session["user_info"] = {"username": username, "password": password}
        return redirect(url_for("index"))

    return render_template("register.html", form = form)


if __name__ == '__main__':
    # 启动应用程序
    app.run(port=8083,debug=True)
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="" method="post">
    {{form.csrf_token}}
    {{form.username.label}}
    <p>{{form.username}}</p>
    {% for msg in form.username.errors %}
        <p>{{msg}}</p>
    {% endfor %}

    {{form.password.label}}
    <p>{{form.password}}</p>
    {% for msg in form.password.errors %}
        <p>{{msg}}</p>
    {% endfor %}

    {{form.password2.label}}
    <p>{{form.password2}}</p>
    {% for msg in form.password2.errors %}
        <p>{{msg}}</p>
    {% endfor %}

    {{form.submit}}

</form>
</body>
</html>