http://pythonhosted.org/Flask-WTF) 扩展可以把处理表单的过程变成一种愉悦的体验。这个扩展对独立的WTForms(http://wtforms.simplecodes.com)包进行了包装,方便集成到Flask程序中。
安装:
pip install flask-wtf
使用:
定义表单类
# 设置秘钥 app.config['SECRET_KEY'] = '123456' # 导入表单基类 from flask_wtf import FlaskForm # 导入相关字段 from wtforms import StringField, SubmitField # 导入相关验证器类 from wtforms.validators import DataRequired class NameForm(FlaskForm): name = StringField('用户名', validators=[DataRequired()]) submit = SubmitField('提交')
添加视图函数
route('/') .def index(): # 创建表单对象 form = NameForm() # 渲染时分配到模板文件 return render_template('form.html', form=form)
表单渲染
{# 原生渲染 #} {# 判断是否有错误#} {% if form.name.errors %} {{ form.name.errors[0] }} {% endif %} <h1>Hello {{ name }}</h1> <form action="{{ url_for('wtform') }}" method="post" > # {{form.hidden_tag()}}里面放的也就是csrf_token {{ form.csrf_token }} {{ form.name.label() }}{{ form.name(id='xx',class='yyy') }} {{ form.submit() }} </form> {# bootstrap渲染 #} {% extends 'bootstrap/base.html' %} {% import 'bootstrap/wtf.html' as wtf %} {% block content %} <div class="container">{{ wtf.quick_form(form) }}</div> {% endblock %}
表单校验
route('/', methods=['GET', 'POST']) .def index(): # 创建表单对象 form = NameForm() name = None # 表单校验 if form.validate_on_submit(): # 通过校验,则取出数据 name = form.name.data form.name.data = '' # 渲染时分配到模板文件 return render_template('form.html', form=form, name=name)
POST重定向GET解决重复提交的问题
route('/wtform/', methods=['GET','POST']) .def wtform(): form = MyForm() # 判断form表单中的数据是否通过校验 if form.validate_on_submit(): # 通过校验,则取出数据。 name = form.name.data last_name = session.get('name') or None # 判断这次提交的name是否和上次的相等 if last_name and last_name == name: return '老铁别重复提交了' else: # 不是重复提交,设置session session['name'] = name return render_template('wtform.html',form=form, name=name) return render_template('wtform.html', form=form)
常见字段类型
字段类型 说明 StringField 普通文本字段 PasswordField 密码文本字段 SubmitField 提交按钮 HiddenField 隐藏文本字段 TextAreaField 多行文本字段 DateField 文本字段,datetime.date格式 DateTimeField 文本字段,datetime.datetime格式 IntegerField 文本字段,整数类型 FloatField 文本字段,小数类型 BooleanField 复选框,值为True或False RadioField 单选框 SelectField 下拉列表 FileField 文件上传字段 常见验证器类
验证器 说明 DataRequired 确保字段有值(并且if判断为真) Email 邮箱地址 IPAddress IPv4的IP地址 Length 规定字符长度 NumberRange 输入数值的范围 EqualTo 验证两个字段的一致性 URL 有效的URL Regexp 正则验证 自定义字段验证:就是写一个'validate_字段'的函数,如下:
class NameForm(FlaskForm): name = StringField('用户名', validators=[DataRequired()]) submit = SubmitField('提交') # 自定义字段验证 def validate_name(self, field): if len(field.data) < 6: raise ValidationError('用户名长度不能少于6个字符')