Flask-WTF
说明
- 表单处理的扩展库,提供了CSRF、字段校验等功能,使用非常方便
安装
文档
使用:
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
from wtforms.validators import Length
class NameForm(FlaskForm):
name = StringField('用户名', validators=[Length(3, 10, message='用户名长度必须在3~10个字符之间')])
submit = SubmitField('提交')
@app.route('/', methods=['GET', 'POST'])
def index():
form = NameForm()
if form.validate_on_submit():
return form.name.data
return render_template('form.html', form=form)
<form method="post">
{# CSRF字段 #}
{{ form.hidden_tag() }}
{{ form.name.label() }}{{ form.name(id='xxx', class='yyy') }}
{% for e in form.name.errors %}
<div>{{ e }}</div>
{% endfor %}
{{ form.submit() }}
</form>
{# 继承自bootstrap基础模板 #}
{% extends 'bootstrap/base.html' %}
{# 导入快速渲染的宏 #}
{% from 'bootstrap/wtf.html' import quick_form %}
{% block content %}
<div class="container">
{# 在合适位置快速渲染表单 #}
{{ quick_form(form) }}
</div>
{% endblock %}
- POST重定向到GET:因为浏览器会记录最后的请求状态,点击刷新时POST请求会有问题。
@app.route('/', methods=['GET', 'POST'])
def index():
form = NameForm()
if form.validate_on_submit():
session['name'] = form.name.data
return redirect(url_for('index'))
name = session.get('name')
return render_template('form2.html', form=form, name=name)
字段类型 |
说明 |
StringField |
普通文本字段 |
SubmitField |
提交按钮 |
PasswordField |
密文字段 |
HiddenField |
隐藏字段 |
RadioField |
单选框 |
BooleanField |
复选框 |
FileField |
文件上传 |
SelectField |
下拉框 |
TextAreaField |
文本域 |
IntegerField |
文本字段,值为整数 |
FloatField |
文本字段,值为浮点数 |
DateField |
datetime.date类型 |
DateTimeField |
datetime.datetime类型 |
验证器 |
说明 |
Length |
规定字符长度 |
DataRequired |
确保字段有值(提示信息与所写的不一致) |
Email |
邮箱地址 |
IPAddress |
IP地址 |
NumberRange |
数值的范围 |
URL |
统一资源定位符 |
EqualTo |
验证两个字段的一致性 |
Regexp |
正则验证 |
from wtforms.validators import ValidationError
class NameForm(FlaskForm):
。。。
def validate_name(self, field):
if len(field.data) < 6:
raise ValidationError('用户名不能少于6个字符')
总结:写字段验证函数,就是写一个'validate_字段名'的函数