安装模块
![17bac8b833836e8ea9c0f3b39874235b.png](https://i-blog.csdnimg.cn/blog_migrate/6f8fff55746383997a2febce6be8e95e.png)
导入模块
![ae5766eba98728c25df0b2fadbc76cd3.png](https://i-blog.csdnimg.cn/blog_migrate/94d7c77840556b734ec8191a355c5131.png)
定义表单控件与认证条件
# 类似于模型类
class RegisterForm(flask_wtf.FlaskForm):
user_name = wtforms.StringField(label='用户名', validators=[wtforms.validators.DataRequired('用户名不能为空')])
password = wtforms.PasswordField(label='密码', validators=[wtforms.validators.DataRequired('密码不可为空')])
password2 = wtforms.PasswordField(label='确认密码', validators=[wtforms.validators.DataRequired('验证密码不可为空'),
wtforms.validators.EqualTo('password','不一致')])
submit = wtforms.SubmitField(label='提交')
定义了文本输入框,密码框,提交按钮
验证表单
form.validate_on_submit()
如果用户输入的内容符合限定,为True,否则为False
前端
测试
![6816bfd177fe04c2a2cb320995af570b.png](https://i-blog.csdnimg.cn/blog_migrate/997e4959ca2b8ff0c89ac7b8bf277d0e.jpeg)
![0b9f1c1fb6cbec68223daf5ee6c7513d.png](https://i-blog.csdnimg.cn/blog_migrate/0453b682efef700c4c1737a2ba1afd20.jpeg)
前端的注意
![435e15f301e0d47681ca120f630060ef.png](https://i-blog.csdnimg.cn/blog_migrate/7db94bdeb94356cf0fa36d9e3e49f4f7.jpeg)
表单的扩展
![d4542212e358a4e8cf2d2ab558b9a7e3.png](https://i-blog.csdnimg.cn/blog_migrate/44a4289c09a6dbf6252f5b5ecde5374a.png)
![c770c6193190203ef88b743814e8a61f.png](https://i-blog.csdnimg.cn/blog_migrate/6d692cc246ad43c1a2188e05c1fab00a.png)
![0f9d1326e4d5e8755d0d506592fbbff4.png](https://i-blog.csdnimg.cn/blog_migrate/9b83296cec54565afec58da6ff5d19de.jpeg)
![8ae7e72d1fb2b517da695175fbff85b7.png](https://i-blog.csdnimg.cn/blog_migrate/3a049b75ca7fb6e9ca5206cc2d5c3c32.jpeg)
![d90030894a9b64d1eae971ba8a7ae6c9.png](https://i-blog.csdnimg.cn/blog_migrate/10b11246ea51f3eb3e1ab8b7733a83dd.jpeg)
![12b764a804c69b76aafdde8097e2df77.png](https://i-blog.csdnimg.cn/blog_migrate/f4637b1eb41a57e5f174432496702220.png)
表单的操作
安装好flask_wtf后
导入后使用
![8ef388edaed2545e7c8a3cc42a58f2ce.png](https://i-blog.csdnimg.cn/blog_migrate/93626d3c7bbe68a6e94a4722c4bd70d2.png)
表单的字段类型,在wtforms中
![f5a9a38770eb77645b9a0fcdbcd84a9e.png](https://i-blog.csdnimg.cn/blog_migrate/24427087f53a21872d62274ee84660c0.jpeg)
![70931020aef7546e64fb0ace64424735.png](https://i-blog.csdnimg.cn/blog_migrate/dab69a3ed3b551b974285ea9dd6ac51c.png)
字段的验证
实例化字段一个字段的时候
传入参数 validators为一个列表,列表中填入相对应的验证数据
![0545cc3256f0db5849ffb250c8901799.png](https://i-blog.csdnimg.cn/blog_migrate/c7595bbbbc86354527be879e657ff804.png)
![2ba378f4fa57a942bdfe6c326faf405a.png](https://i-blog.csdnimg.cn/blog_migrate/795340b93c00df227e45d7e9911855ac.jpeg)
例子
class RegisterForm(flask_wtf.FlaskForm):
user_name = wtforms.StringField(label='用户名', validators=[wtforms.validators.DataRequired('用户名不能为空')])
password = wtforms.PasswordField(label='密码', validators=[wtforms.validators.DataRequired('密码不可为空')])
password2 = wtforms.PasswordField(label='确认密码', validators=[wtforms.validators.DataRequired('验证密码不可为空'),
wtforms.validators.EqualTo('password', '两次不一样')])
@app.route("/register")
def register():
form = RegisterForm()
return flask.render_template("register.html", form=form)
前端
<form action="post">
<!-- {{ form.csrf_token() }}-->
{{ form.user_name.label}}
{{ form.user_name }}
<!-- 错误提示-->
{{ form.user_name.errors }}
</form>
代码
![d84dc8629698fb9f4baeb0bd11fecc96.png](https://i-blog.csdnimg.cn/blog_migrate/f44bf32c52a6061b725bccef1f084dd9.jpeg)
在访问页面的时候
![8a8664ed8f8bbf2e032cf9b3eaa57e3c.png](https://i-blog.csdnimg.cn/blog_migrate/f56b561a0b79fc2750872ded6ee98c4b.png)
需要 加上一个括号即可
![276356d576d328826febf101e6ef60c6.png](https://i-blog.csdnimg.cn/blog_migrate/d7f9579eb11fc650db265735bd9316a9.jpeg)
模板语句
![3bd6da78c2d6f494b7305673fd5b187e.png](https://i-blog.csdnimg.cn/blog_migrate/d9b2d8dc1402af144011b98cf805047f.png)
使用表单校验
在视图中
![56d7b602bfcfa56deaa239fa99ff3e77.png](https://i-blog.csdnimg.cn/blog_migrate/188fb888b8c64ecac62da41b59559460.jpeg)
如果get请求不带参数
form.validate_on__submig():
结果为false
post表单加csrf
![e3c1fe6d3960486315de52701199ebf1.png](https://i-blog.csdnimg.cn/blog_migrate/6777c967e551787d222b5aba5067c7d7.png)