回顾上期的程序代码:
from flask import Flask,render_template
from flask_wtf import FlaskForm
from wtforms import StringField,PasswordField,SubmitField
from wtforms.validators import DataRequired,EqualTo
app = Flask(__name__)
# 配置参数SECRET_KEY
app.config["SECRET_KEY"] = "ASDHJAVDHJASDVASYJDV"
# 定义表单的模型类
class RegisterFrom(FlaskForm):
"""自定义的注册表单模型类"""
# StringField,PasswordField的参数分别是 模块名字,对应验证器
# DataRequired 保证数据必须填写,并且不能为空
user_name = StringField(label = u"用户名",validators=[DataRequired(u"用户名不能为空")])
user_password = PasswordField(label=u"密码",validators=[DataRequired(u"密码不能为空")])
same_password = PasswordField(label=u"确认密码", validators=[DataRequired(u"密码不能为空"),EqualTo("user_password",u"两次密码不一致")])
submit = SubmitField(label="提交")
@app.route("/register")
def index():
form = RegisterFrom()
return render_template("register.html",form = form)
if __name__ == '__main__':
app.run(debug = True,port=8000)
这里的“提交”按钮点击后的数据会返回register函数中,此时可以对返回的数据进行处理,如以下程序进行操作:
from flask import Flask, render_template, redirect, session, url_for
from flask_wtf import FlaskForm
from wtforms import StringField,PasswordField,SubmitField
from wtforms.validators import DataRequired,EqualTo
app = Flask(__name__)
# 配置参数SECRET_KEY
app.config["SECRET_KEY"] = "ASDHJAVDHJASDVASYJDV"
# 定义表单的模型类
class RegisterFrom(FlaskForm):
"""自定义的注册表单模型类"""
# StringField,PasswordField的参数分别是 模块名字,对应验证器
# DataRequired 保证数据必须填写,并且不能为空
user_name = StringField(label = u"用户名",validators=[DataRequired(u"用户名不能为空")])
user_password = PasswordField(label=u"密码",validators=[DataRequired(u"密码不能为空")])
same_password = PasswordField(label=u"确认密码", validators=[DataRequired(u"密码不能为空"),EqualTo("user_password",u"两次密码不一致")])
submit = SubmitField(label="提交")
@app.route("/register", methods=["GET", "POST"])
def register():
# 创建表单对象,如果时post请求,前端发送了数据,flask会把数据在构造form对象的时候,存放到对象中
form = RegisterFrom()
# 判断form中的数据是否合理,如果返回的数据不合理(即通过不了表单的验证器)就不会执行以下代码
if form.validate_on_submit():
name = form.user_name.data
password = form.user_password.data
again_password = form.same_password.data
print(name, password, again_password)
session["user_name"] = name
# 跳转到新建的视窗中
return redirect(url_for("index"))
return render_template("register.html",form = form)
# 新建视窗函数,验证结果是否有误
@app.route("/index")
def index():
result = session.get("user_name", " ")
return "hello %s \n welcome to my world"%result
if __name__ == '__main__':
app.run(debug = True,port=8000)
对应的html文件为:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form method="post">
{{ form.user_name.label }}
<p>{{form.user_name}}</p>
{% for msg in form.user_name.errors %}
<p>{{msg}}</p>
{% endfor %}
{{ form.user_password.label }}
<p>{{form.user_password}}</p>
{% for msg in form.user_password.errors %}
<p>{{msg}}</p>
{% endfor %}
{{ form.same_password.label }}
<p>{{form.same_password}}</p>
{% for msg in form.same_password.errors %}
<p>{{msg}}</p>
{% endfor %}
{{form.submit}}
</form>
</body>
</html>
启动程序后打开浏览器界面为:
当两个密码输入不一致返回的场景为:
当两个密码输入一致返回的场景为:
这里看到当输入参数正确的情况下,没有跳转到新建的视窗中,因为我们只设置cookies里CSRF,但在表单中并没有设置,因此要在表单中设置好CSRF,修改对应的html文件为:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form method="post">
{{ form.csrf_token }}
{{ form.user_name.label }}
<p>{{form.user_name}}</p>
{% for msg in form.user_name.errors %}
<p>{{msg}}</p>
{% endfor %}
{{ form.user_password.label }}
<p>{{form.user_password}}</p>
{% for msg in form.user_password.errors %}
<p>{{msg}}</p>
{% endfor %}
{{ form.same_password.label }}
<p>{{form.same_password}}</p>
{% for msg in form.same_password.errors %}
<p>{{msg}}</p>
{% endfor %}
{{form.submit}}
</form>
</body>
</html>
重新启动程序打开浏览器界面(这是确保输出的参数满足要求,即两次输入的密码一致):
点击“提交”按钮,跳转到新建的视窗中:
上述是一个容易忽略的要点,因此单独拿出来进行说明,以上就是flask使用表单并检验参数的基本方法,有疑问的欢迎评论或私信博主啊。