Flask-WTF是一个集成了WTForms的Flask的扩展 ,可以创建表单类进行验证,也可在HTML中进行渲染表单
创建表单类
每个表单都用一个继承自Form的类表示,每个字段都用一个对象表示,每个对象可以附加多个验证函数。
from flask_wtf import FlaskForm
from wtforms import StringField,SubmitField,PasswordField
from wtforms.validators import DataRequired,Length,Email
class LoginForm(FlaskForm):
username = StringField('用户名',validators=[DataRequired(message='用户名不能为空'),Length[1,64],])
password = PasswordField('密码',validators=[DataRequired(message='密码不能为空')])
sumbit = SubmitField('登陆')
常用的表单字段有:
StringFileld 文本字段
TextAreaField 多行文本
PasswordField 密码文本
SubmitField 表单提交按钮
常用的验证函数:
Email 验证是邮箱地址
EqualTo 比较两个字段的值,一般用于输入两个密码的验证
Length[1,10] 验证长度
Required() 确保字段中有数据
表单渲染
首先在是视图函数中引入一个表单类的实例,然后在返回模版的时候传入实例
@blue.route('/login/',methods=['POST','GET'])
def login():
form = LoginForm()
if request.method == 'GET':
return render_template('login.html',form=form)
if request.method == 'POST':
if form.validate_on_submit():
username = form.username.data
password = form.password.data
....
return redirect(url_for('user.index'))
Login.html
<form method='post' action='.'>
{{ form.csrf.token }}
{{ form.usrname.label }}:{{ form.username }}
{{ form.password.label }}:{{ form.password }}
{{ form.sumbit() }}
</form>
{{ if form.errors }}
{{ form.errors }}
{{ endif }}
- 定义字段名:{{ form.字段名.label }}
- 定义input输入框:{{ form.字段 }}
- 展示错误信息:{{ form.errors.字段 }}
- 跨站请求伪造:{{ form.csrf_token }}
验证数据
当我们点击了提交按钮时,form.validate_on_submit()判断会做出两件事情:
- 通过is_submitted()通过判断HTTP方法来确定是否提交了表单
- 通过WTForms提供的validate()来验证表单数据 (使用我们在最开始写的表单类中给每个字段传入的验证函数)
自定义验证
可以在表单类创建自定义的验证函数
class LoginResigterForm(FlaskForm)
....
def validate_username(self,field):
if User.query.filter_by(username=field.data).first():
raise ValidationError('用户名被注册')
这里用来验证用户名是否已经存在, field.data 是数据
自定义验证函数时,validate_username 时对应的是上面写的username字段,fileld.data也是在页面出输入的username的值
获取数据
验证通过时,我们可以使用form.字段名.data来获得数据