flask对于表单的处理,采用单独的扩展模板Flask-WTF.该模块可以直接定义表单类,然后到前端生成表单,同时可以附加额外的功能,比如防止csrf攻击,防止表单重复提交,进行表单数据验证等。
Flask-WTF采用程序中设置一个密钥,然后生成一个token进行表单验证,对这种攻击进行保护。
app = Flask(__name__)
app.config['SECRET_KEY'] = "a complex string"
每个前端表单都对应着后台的一个表单类,可以先定义好表单字段,过滤函数等,然后在生成相应的表单,表单类继承自Flask-WTF模块的Form类。下面定义一个表单,包含一个字和字段的验证函数和一个按钮。
from flask.ext.wtf import Form
from wtforms import StringField, SubmitField
from wtforms.validators import Required
class NameForm(Form):
name = StringField('What is your name', validators = [Required])
submit = SubmitField('Submit')
WTForms支持一下的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 验证电子邮件地址
EqualTo 比较两个字段的值;常用于要求输入两次密码进行确认的情况
IPAddress 验证IPv4 网络地址
Length 验证输入字符串的长度
NumberRange 验证输入的值在数字范围内
Optional 无输入值时跳过其他验证函数
Required 确保字段中有数据
Regexp 使用正则表达式验证输入值
URL 验证URL
AnyOf 确保输入值在可选值列表中
NoneOf 确保输入值不在可选值列表中
可以直接创建一个表单类实例,然后传入到前端生成表单
也可以在name()或者submit()里面传入参数如id或者class,进行表单样式定义。
更简单的渲染方法是采用Flask-Bootstrap提供的辅助函数。导入预先定义好的宏,采用直接传入表单类实例就可以快速的渲染出一个美观的表单
{% import "bootstrap/wtf.html" as wtf %}
{{ wtf.quick_form(form) }}
定义模板
{% extends "base.html" %}
{% import "bootstrap/wtf.html" as wtf %}
{% block title %}form practice{% endblock %}
{% block page_content %}
hello, {% if name %} {{ name }} {% else %}Stranger{% endif %}
{{wtf.quick_form(form)}}
{% endblock %}
处理表单的视图函数。
@app.route('/', methods=['GET','POST'])
def index():
name = None
form = NameForm() //表单类实例
if form.validate_on_submit()://如果验证通过
name = form.name.data //获取表单name字段的值
form.name.data = ''
return render_template('index.html', form = form, name = name)
Flask重定向函数redirect
Flask提供一个函数直接存储用户的消息,flash('my info')。消息加入之后可以在使用get_flashed_messages()获取所有flash里面存储的消息,消息一旦取出来显示了就不会存在里面,类似于队列的pop