WTForms是一个支持多个web框架的form组件,主要用于对用户请求数据进行验证。当网站中需要用到表单时,WTForms变得很有效。应该把表单定义为类,作为单独的一个模块。
烧瓶-WTF — 烧瓶-WTF 文档 (1.0.x) (flask-wtf.readthedocs.io)https://flask-wtf.readthedocs.io/en/1.0.x/
安装
pip install wtforms
创建表单
通常是创建一个Form的子类,表单的中的字段作为类的属性,如:
from flask_wtf import FlaskForm
from wtforms import StringField
from wtforms.validators import DataRequired
class MyForm(FlaskForm):
name = StringField('name', validators=[DataRequired()])
Form的主要属性:
- data:字典类型,包括每一个字段的数据。如果需要频繁访问字段值,可以使用form.<field>.data进行访问
- errors:字典类型,包括每一个字段的错误信息。
Form的主要字段类型:
- BooleanField
- 复选框,值为True和False
- DateField
- 文本字段,值为datetime.date格式
- 如:YYYY-MM-DD
DateTimeField
- 文本字段,值为datetime.datetime格式
- 如:YYYY-MM-DD HH:MM:SS
- DecimalField
- 文本字段,值为decimal.Decimal
- FileField
- 文件上传字段
- FloatField
- 文本字段,值为浮点数
- FormField
- 把表单作为字段嵌入另一个表单
- HiddenField
- 隐藏文本字段
- IntegerField
- 文本字段,值为整数
- PasswordField
- 密码文本字段
- RadioField
- 一组单选框
- SelectField
- 下拉列表
-
choices参数表示下列的内容,需要是一个列表,列表的每一项是一个元组,如:[(0,'男'),(1,'女')]。
-
coerce参数表示实际选择的内容格式。一般为int
- SelectMultipleField
- 下拉列表,可选择多个值
- 参数与SelectField相同
- StringField
- 文本字段
- SubmitField
- 表单提交按钮
- TextAreaField
- 多行文本字段
- TextField.
- 文本域字段
- RecaptchaField
- 验证码字段
以上字段中都有两个参数,第一个为label,表示这个表单的标签,第二个是validators,是一个列表,表示验证器。
在视图处理程序中验证请求
@app.route('/submit', methods=['GET', 'POST'])
def submit():
form = MyForm()
if form.validate_on_submit():
return redirect('/success')
return render_template('submit.html', form=form)
当form.validate_on_submit()返回True时,则表示验证失败。
flask wtforms 常用验证器:
- Email: 验证上传的数据是否为邮箱
- EqualTo:验证上传的数据是否和另外一个字段相等,常用的就是密码和确认密码两个字段是否相等。
- InputRequired:原始数据的验证。如果不是特说情况,应该使用InutRequired。
- Length: 长度限制,有min 和max两个值进行限制。
- NumberRange:数字区间, 有min和max两个值限制, 荣国处在两个数字之间满足。
- Regexp:自定义正则表达式。
- URL:必须是URL形式。
- UUID:验证UUID
from wtforms import Form, StringField, IntegerField
from wtforms.validators import (Email, EqualTo, InputRequired, Length, NumberRange, Regexp, URL, UUID,ValidationError)
class LoginForm(Form):
email = StringField(validators=[Email()])
username = StringField(validators=[InputRequired, Length(min=3, max=15)])
age = IntegerField(validators=[NumberRange(1,150)])
phont = StringField(validators=[Regexp(r'1[3,5,6,7,8]\d{9}')])
homeurl = StringField(validators=[URL()])
uuid = StringField(validators=[UUID()])
captcha = StringField(validators=[Length(6, 6)])
自定义验证器
from flask_wtf import FlaskForm
from wtforms.validators import ValidationError
from wtforms import StringField
class LoginForm(FlaskForm):
name = StringField()
# 自定义验证器,validate_(写需要验证的字段名captcha)
def validate_name(self, field):
# 在ValidationError中填写错误提示信息, 错误信息可通过 form.errors 获取到
if not field.data:
raise ValidationError('请输入名字')
如果验证失败,抛出ValidationError错误即可。