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('提交')
添加视图函数
@app.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 %}
表单校验
@app.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解决重复提交的问题
@app.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判断为真) |
邮箱地址 | |
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个字符')