WTForms 是一个flask集成框架,或者说是库,用于处理浏览器表单提交的数据,
WTForms的作用主要有两点:1、验证表单;2、渲染模板
一、首先我们从wtfroms库中导入Form、StringField(用户验证input字段类型)代码如下:from wtforms import Form,StringField
二、当您使用WTForms时,要将表单定义为类,创建一个表单验证类,传入参数Form(不传参数是一个普通类):
class RegistForm(Form):
pass
三、接着从wtforms.validator中导入Length,EqualTo(验证用户输入字符长度及密码与确认密码是否一致),代码如下:
from swtforms.validator import Length,EqualTo
四、在该类中定义需要验证的字段及相应的验证条件。注意:name、password、repeat_pwd需与input中name保持一致!代码如下:
class RegistForm(Form):
name = StringField(validators=[Length(max=6,min=3)])
password = StringField(validators=[Length(max=10,min=3)])
repeat_pwd = StringField(validators=[Length(max=10,min=3),EqualTo("password")])
五、异常输出方法:在验证器中定义message参数,代码如下所示:
class RegistForm(Form):
name = StringField(validators=[Length(max=6,min=3)])
password = StringField(validators=[Length(max=10,min=3,message="密码长度必须大于3并且小于10")])
repeat_pwd = StringField(validators=[Length(max=10,min=3,message="密码长度必须大于3并且小于10"),EqualTo("password")])
六、字段定义 字段以声明方式定义为表单上的成员:
class MyForm(Form): name = StringField(u'Full Name', [validators.required(), validators.length(max=10)]) address = TextAreaField(u'Mailing Address', [validators.optional(), validators.length(max=200)])
七、基本字段 class wtforms.fields.BooleanField 复选框,值为true和false class wtforms.fields.DateField 文本字段,值为datatime.date格式 class wtforms.fields.DateTimeField 文本字段,值为datetime.datetime格式 class wtforms.fields.DecimalField 文本字段,值为decimal.Decimal class wtforms.fields.FileField 文本上传字段 class wtforms.fields.MultipleFileField class wtforms.fields.FloatField 文本字段,值为浮点数 class wtforms.fields.IntegerField 文本字段,值为整数 class wtforms.fields.RadioField 一组单选框 class wtforms.fields.SelectField 下拉列表 class wtforms.fields.SelectMultipleField 下拉列表,可选择多个值 class wtforms.fields.StringField 文本字段
八、Validators
验证器只需输入一个输入,验证它是否知足某些标准,例如字符串的最大长度并返回。或者,若是验证失败,则引起a ValidationError
。该系统很是简单灵活,容许您在字段上连接任意数量的验证器。
常用验证函数: DataRequired 确保字段中有数据 EqualTo 比较两个字段的值,常用于比较两次密码输入 Length 验证输入的字符串长度 Email 验证电子邮件
NumberRange 验证输入的值在数字范围内 URL 验证url AnyOf 验证输入值在可选列表中 NoneOf 验证输入值不在列表中
九、用户注册实例 from flask import Blueprint,render_template,request from wtforms.fields import simple from wtforms.fields import html5 from flask_wtf import FlaskForm from wtforms.fields import core from wtforms import StringField from wtforms import widgets,validators class MyForm(FlaskForm): # == == == == == == == == == == == =simple == == == == == == == == == == == == == = name = StringField( label='姓名:', validators=[validators.DataRequired()], widget=widgets.TextInput(), render_kw={"class": "form-control"}, # 添加一些样式,用于Bootstrap ) pwd = simple.PasswordField( label="密码", validators=[ validators.DataRequired(message="密码不能为空") ] ) pwd_confim = simple.PasswordField( label="重复密码", validators=[ validators.DataRequired(message='重复密码不能为空.'), validators.EqualTo('pwd', message="两次密码不一致") ], widget=widgets.PasswordInput(), render_kw={'class': 'form-control'} ) #========================html5============================ email = html5.EmailField( # 注意这里用的是html5.EmailField label='邮箱', validators=[ validators.DataRequired(message='邮箱不能为空.'), validators.Email(message='邮箱格式错误') ], widget=widgets.TextInput(input_type='email'), render_kw={'class': 'form-control'} ) #===================如下是用core来调用的======================= gender = core.RadioField( label="性别", choices=( (1,"男"), (1,"女"), ), coerce=int #限制是int类型的 ) city = core.SelectField( label="城市", choices=( ("bj","北京"), ("sh","上海"), ) ) hobby = core.SelectMultipleField( label='爱好', choices=( (1, '篮球'), (2, '足球'), ), coerce=int ) favor = core.SelectMultipleField( label="喜爱", choices=( (1, '篮球'), (2, '足球'), ), widget = widgets.ListWidget(prefix_label=False), option_widget = widgets.CheckboxInput(), coerce = int, default = [1, 2] ) def __init__(self, *args, **kwargs): # 这里的self是一个RegisterForm对象 '''重写__init__方法''' super(MyForm, self).__init__(*args, **kwargs) # 继承父类的init方法 self.favor.choices = ((1, '篮球'), (2, '足球'), (3, '羽毛球')) # 吧RegisterForm这个类里面的favor从新赋值 # 方法验证 def validate_pwd_confim(self, field, ): ''' 自定义pwd_config字段规则,例:与pwd字段是否一致 :param field: :return: ''' # 最开始初始化时,self.data中已经有全部的值 if field.data != self.data['pwd']: # raise validators.ValidationError("密码不一致") # 继续后续验证 raise validators.StopValidation("密码不一致") # 再也不继续后续验证 register = Blueprint("register",__name__) @register.route("/regist",methods=["GET","POST"]) def regist(): if request.method == "GET": form = MyForm() return render_template("regis.html",forms = form) form = MyForm(formdata=request.form) if form.validate(): #验证是否成功 print("数据校验经过") else: return render_template("regis.html",forms = form)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>注册</title> <meta name="viewport" content="width=device-width, initial-scale=1.0"> </head> <body> <form action="" method="post"> {# {{ form.name.label }}#} {# {{ form.name }}#} {# {{ form.name.errors.0 }}#} {% for form in forms %} <p> {% if form.label.text == "CSRF Token" %} {% else %} {{ form.label }} {{ form }} <span style="color: red;">{{ form.errors.0 }}</span> {% endif %} </p> {% endfor %} <input type="submit" value="提交"> </form> </body> </html>