相当于Django中的modelform组件(生成表单、验证)
pip3 install WTForms
实验一:登录页面
from flask import Flask,render_template,request from wtforms.fields import simple,core #创建组件 from wtforms import Form from wtforms import validators #验证 app = Flask(__name__) app.debug=True app.secret_key='asdf' class LoginForm(Form): username = simple.StringField( label='用户名', #标签标记 validators=[validators.DataRequired(message='用户名不能为空'),validators.Length(min=3,max=8,message='不是长了就是短了')], filters=tuple(), description='', #描述标记 id='login', #标签id default=None,#默认值 widget=None, #默认组件(input type='text')在StringField中已经被实例化了 render_kw={'class':'my_login'} # {'class':'my_login'} ) password = simple.StringField( label='密码', #标签标记 validators=[validators.DataRequired(message='密码不能为空'), validators.Length(min=3,max=8,message='不是长了就是短了'), validators.Email(message='密码不符合邮箱规则')], filters=tuple(), description='', #描述标记 id='login', #标签id default=None,#默认值 widget=None, #默认组件(input type='text')在StringField中已经被实例化了 render_kw={'class':'my_login'} # {'class':'my_login'} ) @app.route('/',methods=['GET','POST']) def index(): if request.method == 'GET': fm = LoginForm() return render_template('index.html',wtf = fm) else: new_fm = LoginForm(request.form) if new_fm.validate():#验证数据 return new_fm.data.get('username') else: return render_template('index.html', wtf=new_fm) if __name__ == '__main__': app.run(debug=True)
index.html
<form action="" method="post" novalidate> {{ wtf.username.label }} {{ wtf.username }} {{ wtf.password.label }} {{ wtf.password }} <p>{{ wtf.username.errors.0 }}</p> <p>{{ wtf.password.errors.0 }}</p> <input type="submit" value="登录"> </form>
测试
实验二:注册
from flask import Flask,render_template,request from wtforms.fields import simple,core #创建组件 from wtforms import Form from wtforms import validators #验证 app = Flask(__name__) app.debug=True app.secret_key='asdf' class RegForm(Form): username = simple.StringField( label='用户名', #标签标记 validators=[validators.DataRequired(message='用户名不能为空'),validators.Length(min=3,max=8,message='用户名不是长了就是短了')], ) password = simple.StringField( label='密码', #标签标记 validators=[validators.DataRequired(message='密码不能为空'), validators.Length(min=3,max=8,message='不是长了就是短了'), validators.Email(message='密码不符合邮箱规则')], ) re_password = simple.StringField( label='确认密码', #标签标记 validators=[validators.EqualTo(fieldname='password',message='两次密码不相同')], ) gender = core.RadioField( label="性别", coerce=str, choices=( ("1","女"), ("2","男") ), default="1" ) hobby = core.SelectMultipleField( label="爱好", validators=[validators.Length(min=2,max=4,message="癖好有问题")], coerce=int, choices=( (1, "fengjie"), (2, "luoyufeng"), (3, "lixueqin"), (4, "wuyifan"), (5, "panta") ), default=(1,3,5) ) @app.route('/reg',methods=['GET','POST']) def reg(): if request.method == 'GET': rf = RegForm() return render_template('reg.html',rf = rf) else: rf = RegForm(request.form) if rf.validate():#验证数据 return rf.data.get('username') else: return render_template('reg.html', rf=rf) if __name__ == '__main__': app.run(debug=True)
reg.html
<form action="" method="post" novalidate> {% for field in rf %} <p>{{ field.label }}{{ field }} {{ field.errors.0 }}</p> {% endfor %} <input type="submit" value="注册"> </form>
测试