web表单是web应用程序的基本功能。
它是HTML页面中负责数据采集的部件。表单有三个部分组成:表单标签、表单域、表单按钮。表单允许用户输入数据,负责HTML页面数据采集,通过表单将用户输入的数据提交给服务器。
在Flask中,为了处理web表单,我们一般使用Flask-WTF扩展,它封装了WTForms,并且它有验证表单数据的功能。
使用Flask-WTF需要配置参数SECRET_KEY。
CSRF_ENABLED是为了CSRF(跨站请求伪造)保护。 SECRET_KEY用来生成加密令牌,当CSRF激活的时候,该设置会根据设置的密匙生成加密令牌。
# coding:utf-8 from flask import Flask, render_template, redirect, url_for, session from flask_wtf import FlaskForm from wtforms import StringField, PasswordField, SubmitField from wtforms.validators import DataRequired, EqualTo app = Flask(__name__) # 使用Flask-WTF需要配置参数SECRET_KEY。否则报错 app.config["SECRET_KEY"] = "xhosd6f982yfhowefy29f" # 定义表单的模型类 class RegisterForm(FlaskForm): """自定义的注册表单模型类""" # 字段 名字 检验器/验证器 user_name = StringField(label=u"用户名", validators=[DataRequired(u"用户名不能为空")]) password = PasswordField(label=u"密码", validators=[DataRequired(u"密码不能为空")]) password2 = PasswordField(label=u"确认密码", validators=[DataRequired(u"确认密码不能为空"), EqualTo("password", u"两次密码不一致")]) submit = SubmitField(label=u"提交") @app.route("/register", methods=["GET", "POST"]) def register(): # 创建表单对象, 如果是post请求,前端发送了数据,flask会把数据在构造form对象的时候,存放到对象中 form = RegisterForm() # 判断form中的数据是否合理 # 如果form中的数据完全满足所有的验证器,则返回真,否则返回假 if form.validate_on_submit(): # 表示验证合格 # 提取数据 uname = form.user_name.data pwd = form.password.data pwd2 = form.password2.data print(uname, pwd, pwd2) session["user_name"] = uname return redirect(url_for("index")) return render_template("register.html", form=form) @app.route("/index") def index(): user_name = session.get("user_name", "") return "hello %s" % user_name if __name__ == '__main__': app.run(debug=True) <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form method="post"> <!-- 设置csrf_token以验证CSRF 否则后端无法收到数据 --> {{ form.csrf_token }} {{ form.user_name.label }} {{form.user_name}} <!-- 如果有报错输出报错信息 --> {% for msg in form.user_name.errors %} <p>{{msg}}</p> {% endfor %} <br> {{ form.password.label }} {{form.password}} {% for msg in form.password.errors %} <p>{{msg}}</p> {% endfor %} <br> {{ form.password2.label }} {{form.password2}} {% for msg in form.password2.errors %} <p>{{msg}}</p> {% endfor %} <!-- 提交按钮 --> {{form.submit}} </form> </body> </html>