之前,学习使用request.form获取表单数据。但是有些任务重复单调,可以实现自动化管理,比如 :生成表单的HTML代码、验证提交的表单数据。
Flask-wtf是flask的一个扩展,可以把重复工作变得更简单。
# pyCharm Terminal #安装
pip install flask-wtf
# test.py
app = Flask(__name__)
app.config['SECRET_KEY'] = 'hard to guess string' #设置app的config字典
app的config字典用来存储框架、扩展和程序本身的配置变量。
# test.py
from flask_wtf import FlaskForm #引入FlaskForm类,作为自定义Form类的基类
from wtforms import StringField,SubmitField #StringField对应HTML中type="text"的元素,SubmitField对应type='submit'的元素
from wtforms.validators import Required #引入验证函数
class NameForm(FlaskForm):
name = StringField('What is your name?',validators=[Required()])
submit = SubmitField('Submit')
在这个示例中,NameForm表单有一个
名为name的文本字段(我感觉类似于Qt中的QLineEdit类)和一个名为submit的提交按钮(感觉类似于Qt中的QPushButton类)。字段(StringField和SubmitField)的构造函数的第一参数对应HTML的标号(用以显示的字)。
name = StringField('What is your name?',validators=[Required()])
validators指定一个由验证函数组成的列表 。(验证函数,我感觉就是对用户输入的一种检查:排除非法输入)。
附:WTFForms支持的HTML标注字段
字段类型 说 明
StringField 文本字段
TextAreaField 多行文本字段
PasswordField 密码文本字段
HiddenField 隐藏文本字段
DateField 文本字段,值为 datetime.date 格式
DateTimeField 文本字段,值为 datetime.datetime 格式
IntegerField 文本字段,值为整数
DecimalField 文本字段,值为 decimal.Decimal
FloatField 文本字段,值为浮点数
BooleanField 复选框,值为 True 和 False
RadioField 一组单选框
SelectField 下拉列表
SelectMultipleField 下拉列表,可选择多个值
FileField 文件上传字段
SubmitField 表单提交按钮
FormField 把表单作为字段嵌入另一个表单
FieldList 一组指定类型的字段
附:WTForms 内建的验证函数
函数 说明
Email 验证电子邮件地址NoneOf 确保输入值不在可选值列表中
# index.html
{% extends "base.html" %}
{% block title %}Flasky{% endblock %}
{% block navbar %}
Hello, {{ name }}!
#需要传入的变量{{ name }}
{% endblock %}
{% endblock %}
{% block content %} #正文block
# index.html
{% import "bootstrap/wtf.html" as wtf %} #引入wtf.html中的定义,并起别名wtf(类比python模块)
{% block content %}
Hello, {{ name }}!
{{ wtf.quick_form(form) }} #wtf.quick_form(form)使用默认的样式渲染form
{% endblock %}
1、客户端输入URL,访问服务器。向服务器发出一个GET请求
2、服务器收到请求。进入视图函数(index())处理。
# tset.py
@app.route("/",methods=['GET','POST'])
def index():
name = None
form = NameForm()
if form.validate_on_submit(): #服务器收到没有表单数据的GET请求 ,因此form.validate_on_submit() == False
name = form.name.data #不执行,跳过
form.name.data='' #不执行 ,跳过
return render_template('index.html',name=name,form=form) #把name,form变量传入模板,渲染,返回给客户端。
3、客户端收到并显示表单
4、用户输入并提交表单
5、服务器收到包含数据的POST请求
6、再进视图函数,validate_on_submit()函数调用验证函数(Required()),验证通过返回True,否则返回False.
# test.py
@app.route("/",methods=['GET','POST'])
def index():
name = None
form = NameForm()
if form.validate_on_submit(): #返回True
name = form.name.data #执行
form.name.data='' #执行
return render_template('index.html',name=name,form=form) #把name,form变量传入模板,渲染,返回。
7、客户端最终效果