Flask-WTF

说明

  • 表单处理的扩展库,提供了CSRF、字段校验等功能,使用非常方便

安装

  • pip install flask-wtf

文档

使用:

  • 创建表单类
# 导入表单基类
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方式进行快速渲染
{# 继承自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_字段名'的函数

results matching ""

    No results matching ""