安装flask-wtf
pip3 install flask-wtf -i https://pypi.douban.com/simple
表单使用三步骤:
一:构建表单类
from wtforms import SubmitField, StringField, PasswordField
from wtforms.validators import DataRequired, EqualTo
# 创建表单类
class RegistForm(FlaskForm):
username = StringField('用户名', validators=[DataRequired("用户名不能为空")])
pwd = PasswordField('密码', validators=[DataRequired('密码不能为空')])
pwd2 = PasswordField('重复密码', validators=[DataRequired('密码不能为空'), EqualTo('pwd', '两次密码不一致')])
submit = SubmitField('注册')
二:定义路由函数,生成表单对象,获取表单数据,进行表单验证
# 定义路由函数,生成表单
@app.route('/regist', methods=['GET', 'POST'])
def regist():
# 创建表单对象,如果式post提交,前端发送的数据会保存在该表单对象
form = RegistForm()
# 判断表单字段是否合理,只有当所有验证通过,form.validate_on_submit才返货True
if form.validate_on_submit():
# 验证合格,获取数据
username = form.username.data
password = form.pwd.data
password2 = form.pwd2.data
print(username, password, password2)
session['username'] = username
session['password'] = password
return redirect(url_for('index'))
return render_template('regist.html', form=form)
三: 在模板中创建表单
<form action="" method='post'>
<!-- csrf攻击防护 -->
{{ form.csrf_token }}
<!-- 用户名框 -->
{{ form.username.label }} </br>
<p>{{ form.username }}</p>
<!-- 错误时,显示提示 -->
{% for error in form.username.errors %}
<p>{{ error }}</p>
{% endfor %}
<!-- 密码框 -->
{{ form.pwd.label }} </br>
<p>{{ form.pwd }}</p>
{% for error in form.pwd.errors %}
<p>{{ error }}</p>
{% endfor %}
<!-- 重复密码框 -->
{{ form.pwd2.label }}
</br><p>{{ form.pwd2 }}</p>
{% for error in form.pwd2.errors %}
<p>{{ error }}</p>
{% endfor %}
<!-- 提交 -->
<p>{{ form.submit }}</p>
</form>
常用表单字段
StringField 文本字段
TextAreaField 多行文本字段
PasswordField 密码文本字段
HiddenField 隐藏文本字段
DateField
DateTimeField
IntegerField
DecimalField 十进制小数
FloatField 浮点数
BooleanField 布尔值
RadioField 单选框
SelectField 下拉列表
SelectMultipleField 下拉列表,可选多个值
FileField 文本上传文字段
SubmitField 表单提交按钮
FormField 嵌套表单
FieldList 一组指定类型的字段
常用验证函数
需要设置SECRET_KEY
from wtforms.validators import ……(对应的验证函数)
DataRequired(‘用户名不能为空’) 必填项 // 可选参参数,参数值为错误提示词
EqualTo(…) 比较两个值一样 // 两个参数,一为比较项,一为错误提示
Length 验证输入的字符串长度
NumberRange 验证输入的值是否在数字范围
URL 验证url
AnyOf 验证输入值在可选列表中
NoneOf 验证输入值不再可选列表中
实例完整代码
from flask import Flask, render_template, redirect, url_for, session
from flask_wtf import FlaskForm
from wtforms import SubmitField, StringField, PasswordField
from wtforms.validators import DataRequired, EqualTo
app = Flask(__name__)
app.config['SECRET_KEY'] = "aslasfobjbfjk12bbkf3"
# 创建表单类
class RegistForm(FlaskForm):
username = StringField('用户名', validators=[DataRequired("用户名不能为空")])
pwd = PasswordField('密码', validators=[DataRequired('密码不能为空')])
pwd2 = PasswordField('重复密码', validators=[DataRequired('密码不能为空'), EqualTo('pwd', '两次密码不一致')])
submit = SubmitField('注册')
# 定义路由函数,生成表单
@app.route('/regist', methods=['GET', 'POST'])
def regist():
# 创建表单对象,如果式post提交,前端发送的数据会保存在该表单对象
form = RegistForm()
# 判断表单字段是否合理,只有当所有验证通过,form.validate_on_submit才返回True
if form.validate_on_submit():
# 验证合格,获取数据
username = form.username.data
password = form.pwd.data
password2 = form.pwd2.data
print(username, password, password2)
session['username'] = username
session['password'] = password
return redirect(url_for('index'))
return render_template('regist.html', form=form)
@app.route('/index')
def index():
username = session.get('username', '')
return "Hello %s" % username
if __name__ == "__main__":
app.run(debug=True)
regidt.html
<form action="" method='post'>
<!-- csrf攻击防护 -->
{{ form.csrf_token }}
<!-- 用户名框 -->
{{ form.username.label }} </br>
<p>{{ form.username }}</p>
<!-- 错误时,显示提示 -->
{% for error in form.username.errors %}
<p>{{ error }}</p>
{% endfor %}
<!-- 密码框 -->
{{ form.pwd.label }} </br>
<p>{{ form.pwd }}</p>
{% for error in form.pwd.errors %}
<p>{{ error }}</p>
{% endfor %}
<!-- 重复密码框 -->
{{ form.pwd2.label }}
</br><p>{{ form.pwd2 }}</p>
{% for error in form.pwd2.errors %}
<p>{{ error }}</p>
{% endfor %}
<!-- 提交 -->
<p>{{ form.submit }}</p>
</form>